Verwendung von RestSharp mit async / await


102

Ich habe Probleme, ein modernes Beispiel für asynchronen C # -Code zu finden, der RestSharp mit asyncund verwendet await. Ich weiß, dass es kürzlich ein Update von Haack gegeben hat, aber ich weiß nicht, wie ich die neuen Methoden verwenden soll.

Wie kann ich auch ein Stornierungs-Token bereitstellen, damit der Vorgang abgebrochen werden kann (z. B. wenn eine Person das Warten satt hat und die Schaltfläche Abbrechen in der Benutzeroberfläche der App drückt)?

Antworten:


201

Nun, das Update, auf das sich Haack bezieht, wurde von mir gemacht :) Lassen Sie mich Ihnen zeigen, wie man es benutzt, da es eigentlich sehr einfach ist. Zuvor hatten Sie ExecuteAsyncGetsolche Methoden , die einen benutzerdefinierten RestSharp-Typ mit dem Namen zurückgaben RestRequestAsyncHandle. Dieser Typ kann nicht erwartet werden , wie async/awaitauf Werke Taskund Task<T>Rückgabetypen. Meine Pull-Anfrage fügte den vorhandenen asynchronen Methoden, die Task<T>Instanzen zurückgeben, Überladungen hinzu . Diesen Task<T>Überladungen wird eine zusätzliche "Task" -String hinzugefügt, beispielsweise wird die Task<T>Überladung für ExecuteAsyncGetaufgerufen ExecuteGetTaskAsync<T>. Für jede der neuen Task<T>Überladungen gibt es eine Methode, für die keine erforderlich istCancellationToken Angabe , und eine, die dies tut.

Nun zu einem tatsächlichen Beispiel für die Verwendung, das auch zeigt, wie ein CancellationToken:

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    var cancellationTokenSource = new CancellationTokenSource();

    var restResponse = 
        await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);

    // Will output the HTML contents of the requested page
    Console.WriteLine(restResponse.Content); 
}

Dies verwendet die ExecuteTaskAsyncÜberladung, die eine Task<IRestResponse>Instanz zurückgibt . Wenn a zurückgegeben wird Task, können Sie das awaitSchlüsselwort für diese Methode verwenden und den Task<T>zurückgegebenen Typ des Typs zurückgeben (in diesem Fall IRestResponse).

Den Code finden Sie hier: http://dotnetfiddle.net/tDtKbL


AH! Ich denke ich: Herz: du !! (Und sehr passend, wenn man bedenkt, dass es Valentinstag ist). Dies wäre SEHR schön, um es dem RestSharp-Wiki hinzuzufügen. Ok, also ... gibt es auch eine PCL davon? Oder drücke ich mein Glück?
Pure.Krome

Ich bin mir nicht sicher, ob eine PCL-Version davon funktionieren würde, aber ich werde sie in Zukunft prüfen. Und ich bin damit einverstanden, dass es schön wäre, das Wiki zu erweitern. Ich weiß nicht, ob ich es bearbeiten darf (ich bin kein regelmäßiger Verwalter der Bibliothek).
Erik Schierboom

Vielleicht können wir @Haacked in die Convo bringen, vielleicht auf Twitter?
Pure.Krome

3
Wie kann ich meiner benutzerdefinierten IRestResponse-Implementierung zuordnen?
jpgrassi

2
Da ich Restsharp zuletzt ungefähr zur gleichen Zeit verwendet habe, als Schulterpolster in Mode waren, waren Rotationstelefone die Norm und wir alle haben es geliebt, unser Lieblings-BBS über unser Robotics 14.4k-Modem zu erreichen. Grünes Häkchen der Antwortgenehmigung, werde ich.
Pure.Krome

2

In meinem Fall musste ich Task.Wait () aufrufen, damit es ordnungsgemäß funktioniert. Ich habe jedoch die Version verwendet, die CancellationTokenSource nicht als Parameter verwendet.

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    Task<IRestResponse> t = client.ExecuteTaskAsync(request);
    t.Wait();
    var restResponse = await t;
    Console.WriteLine(restResponse.Content); // Will output the HTML contents of the requested page
}

9
Wenn WaitSie keinen asynchronen Code verwenden, führen Sie ihn nur synchron aus.
Der Muffin-Mann

In meinem Fall wird der Aufruf von ExecuteTaskAsynk (mit oder ohne Stornierungstoken) nicht zurückgegeben und der IIS reagiert nicht mehr. Ich musste diesen HACK verwenden, bis ich die Ursache gefunden hatte.
Alex 75

Wenn Sie warten, warum verwenden Sie nicht einfach die Synchronisierungsversion des Anrufs ... sinnlos
Egli Becerra

1
Geben Sie den Thread nicht frei, um ihn an anderer Stelle zu verwenden? Bei einem Langzeitbetrieb am anderen Ende ist das von Vorteil, oder?
Benmccallum
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.