Hoe RestSharp te gebruiken met async/wait

Ik heb moeite om een ​​modern voorbeeld te vinden van een asynchrone C#-code die RestSharp gebruikt met asyncen await. Ik weet dat er een recente update is geweest door Haackmaar ik weet niet hoe ik de nieuwe methoden moet gebruiken.

Hoe kan ik ook een annuleringstoken verstrekken zodat de bewerking kan worden geannuleerd (bijvoorbeeld als iemand het wachten beu is en op de knop Annuleren drukt in de gebruikersinterface van de app).


Antwoord 1, autoriteit 100%

Nou, de update waar Haack naar verwijst is door mij gemaakt 🙂 Dus laat me je laten zien hoe je het kunt gebruiken, want het is eigenlijk heel eenvoudig. Voorheen had je methoden zoals ExecuteAsyncGetdie een RestSharp aangepast type met de naam RestRequestAsyncHandlezouden retourneren. Dit type kan niet worden afgewacht omdat async/awaitwerkt op Tasken Task<T>retourtypen. Mijn pull-request voegde overbelasting toe aan de bestaande async-methoden die Task<T>-instanties retourneren. Deze Task<T>overbelastingen hebben een toegevoegde “Task” string toegevoegd aan hun naam, bijvoorbeeld de Task<T>overbelasting voor ExecuteAsyncGetis genaamd ExecuteGetTaskAsync<T>. Voor elk van de nieuwe Task<T>-overbelastingen is er één methode waarvoor geen CancellationTokenhoeft te worden opgegeven, en er is er één die dat wel doet.

Dus nu naar een echt voorbeeld van hoe het te gebruiken, dat ook laat zien hoe je een CancellationTokengebruikt:

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); 
}

Hierdoor wordt de ExecuteTaskAsync-overbelasting gebruikt die een Task<IRestResponse>-instantie retourneert. Aangezien het een Taskretourneert, kunt u het sleutelwoord awaitbij deze methode gebruiken en het geretourneerde type Task<T>(in dit geval IRestResponse).

Je kunt de code hier vinden: http://dotnetfiddle.net/tDtKbL


Antwoord 2

In mijn geval moest ik Task.Wait() aanroepen om het correct te laten werken. Ik heb echter de versie gebruikt die CancellationTokenSource niet als parameter gebruikt.

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
}

Other episodes