Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

RestClient.Execute() is extremely slow compared to RestClient.ExecuteAsync().Result

Offen
#2,375 4 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
45/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Ruhig
Tech-Stack
csharp

Rechercherichtung

Beginne damit, die Einstiegspunkte RestClient.Execute() und RestClient.ExecuteAsync() nachzuverfolgen, und reproduziere den Zeitunterschied mit dem bereitgestellten Parallel.For-Beispiel unter .NET 8. Vergleiche ihre synchronen Ausführungspfade bei paralleler Nutzung und überprüfe anschließend, dass gleichwertige Aufrufe eine vergleichbare Leistung aufweisen und die gemeldete Verzögerung behoben ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug

Describe the bug
RestClient.Execute() is extremely slow compared to RestClient.ExecuteAsync().Result, when called in a parallel setting, even though both are synchronous.

To Reproduce

private class CustomInterceptor : Interceptor
{
    public override ValueTask BeforeDeserialization ( RestResponse response, CancellationToken cancellationToken )
    {
        response.ContentType = ContentTypes.application_json;
        return ValueTask.CompletedTask;
    }
}

static void Test02 ()
{
    //
    const int total = 100;
    int width = ( int ) Math.Ceiling( Math.Log10( total ) );
    ( int, TimeSpan )[] elapsed = new ( int, TimeSpan )[total];
    //

    RestResponse    Execute    ( RestClient c, string resource, Method method, Action<RestRequest> callback )
    {
        //
        RestRequest     i;
        RestResponse    o;
        //

        if ( c == null )
            throw new ArgumentNullException( nameof( c ) );

        i = new RestRequest( resource, method );
        callback?.Invoke( i );
        i.Interceptors = [];
        i.Interceptors.Add( new CustomInterceptor() );
        o = c.Execute( i );
        return o;
    }

    void Test ( int i )
    {
        //
        Stopwatch watch;
        //

        static void Add ( RestRequest t )
        {
            t.AddHeader( HTTPHeaders.Content_Type, ContentTypes.application_json );
        }

        watch = Stopwatch.StartNew();
        using ( var c = new RestClient( some server ) )
            Execute( c, "", Method.Post, Add );

        watch.Stop();
        elapsed[i] = ( i, watch.Elapsed );
    }

    Parallel.For( 0, total, Test );

    ////

    Array.Sort( elapsed, ( x, y ) => y.Item2.CompareTo( x.Item2 ) );
    for ( int i = 0; i < total; i++ )
        Console.WriteLine( $@"{elapsed[i].Item1.ToString().PadLeft( width )} => {elapsed[i].Item2:mm\:ss\.fff}" );
}

If you use the above code, which uses c.Execute( i ), to communicate to a server, there will be very long delays (up to roughly 10 s). If you replace c.Execute( i ) with c.ExecuteAsync( i ).Result, the time is reduced to just roughly 1 s.

Expected behavior
Since both RestClient.Execute() and RestClient.ExecuteAsync().Result are synchronous, both should have the exact same performance.

Desktop

  • OS: Windows 11
  • .NET 8.0
  • Version 114.0.0
Vorherrschende Sprache
C#
Sterne
9.8k
Forks
2.3k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Entwicklungsumgebung

In Codespaces öffnen

Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus restsharp/RestSharp

Alle Issues in restsharp/RestSharp

Ähnliche Issues

Weitere Issues zu C#

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.