Ik heb moeite om een modern voorbeeld te vinden van een asynchrone C#-code die RestSharp gebruikt met async
en 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 ExecuteAsyncGet
die een RestSharp aangepast type met de naam RestRequestAsyncHandle
zouden retourneren. Dit type kan niet worden afgewacht omdat async/await
werkt op Task
en 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 ExecuteAsyncGet
is genaamd ExecuteGetTaskAsync<T>
. Voor elk van de nieuwe Task<T>
-overbelastingen is er één methode waarvoor geen CancellationToken
hoeft 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 CancellationToken
gebruikt:
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 Task
retourneert, kunt u het sleutelwoord await
bij 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
}