web-dev-qa-db-fra.com

Comment utiliser RestSharp avec async / wait

J'ai du mal à trouver un exemple moderne de code C # asynchrone utilisant RestSharp avec async et await. Je sais qu'il y a ne récente mise à jour de Haack mais je ne sais pas comment utiliser les nouvelles méthodes.

Aussi, comment puis-je fournir un jeton d'annulation pour que l'opération puisse être annulée (par exemple, si une personne est malade d'attendre et appuie sur le bouton Annuler de l'interface utilisateur de l'application).

88
Pure.Krome

Eh bien, la mise à jour à laquelle Haack fait référence a été faite par moi :) Alors laissez-moi vous montrer comment l’utiliser, car c’est en fait très simple. Auparavant, vous utilisiez des méthodes telles que ExecuteAsyncGet qui renverraient un type personnalisé RestSharp nommé RestRequestAsyncHandle. Ce type ne pouvait pas être attendu car async/await Fonctionnait sur les types de retour Task et Task<T>. Ma requête pull ajoute des surcharges aux méthodes asynchrones existantes qui renvoient des instances Task<T>. Ces surcharges Task<T> Ont une chaîne "Task" ajoutée à leurs noms. Par exemple, la surcharge Task<T> Pour ExecuteAsyncGet s'appelle ExecuteGetTaskAsync<T>. Pour chacune des nouvelles surcharges Task<T>, Il existe une méthode pour laquelle il n'est pas nécessaire de spécifier un CancellationToken, et une autre qui le fait.

Passons maintenant à un exemple concret d'utilisation, qui montrera également comment utiliser un 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); 
}

Ceci utilisera la surcharge ExecuteTaskAsync qui renvoie une instance Task<IRestResponse>. Comme il retourne un Task, vous pouvez utiliser le mot clé await de cette méthode et obtenir le type renvoyé par Task<T> (Dans ce cas IRestResponse) .

Vous pouvez trouver le code ici: http://dotnetfiddle.net/tDtKbL

177
Erik Schierboom

Dans mon cas, j'ai dû appeler Task.Wait () pour que cela fonctionne correctement. Cependant, j'ai utilisé la version qui ne prend pas CancellationTokenSource en paramètre.

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
}
2
Ram Jayaraman