Comment utiliser RestSharp avec async / await


103

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

En outre, comment puis-je fournir un jeton d'annulation afin que l'opération puisse être annulée (par exemple, si une personne en a assez d'attendre et appuie sur le bouton Annuler dans l'interface utilisateur de l'application).

Réponses:


202

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 elle est en fait très simple. Auparavant, vous aviez des méthodes comme ExecuteAsyncGetcelle qui renvoyaient un type personnalisé RestSharp nommé RestRequestAsyncHandle. Ce type ne pouvait pas être attendu car async/awaitfonctionne sur Tasket Task<T>retourne les types. Ma demande d'extraction a ajouté des surcharges aux méthodes asynchrones existantes qui retournent des Task<T>instances. Ces Task<T>surcharges ont une chaîne "Tâche" ajoutée à leurs noms, par exemple la Task<T>surcharge pour ExecuteAsyncGetest appelée ExecuteGetTaskAsync<T>. Pour chacune des nouvelles Task<T>surcharges, il existe une méthode qui ne nécessite CancellationTokenpas la spécification de a et une autre le fait.

Alors maintenant, passons à un exemple réel sur la façon de l'utiliser, 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); 
}

Cela utilisera la ExecuteTaskAsyncsurcharge qui renvoie une Task<IRestResponse>instance. Lorsqu'il renvoie a Task, vous pouvez utiliser le awaitmot clé sur cette méthode et obtenir le Task<T>type renvoyé de s (dans ce cas IRestResponse).

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


Ah! Je pense que je: coeur: toi !! (Et très approprié, étant donné que c'est la Saint-Valentin). Ce serait TRÈS agréable à ajouter au wiki RestSharp. Ok, alors ... y a-t-il une chance qu'il y ait un PCL de ça, aussi? Ou est-ce que je pousse ma chance?
Pure.Krome

Je ne sais pas si une version PCL de cela fonctionnerait, mais je l'examinerai à l'avenir. Et je suis d'accord que ce serait bien d'ajouter au wiki, je ne sais pas si je suis autorisé à le modifier (je ne suis pas un responsable régulier de la bibliothèque).
Erik Schierboom

Peut-être que nous pouvons obtenir @Haacked dans la conversation, peut-être sur Twitter?
Pure.Krome

3
Comment puis-je mapper à mon implémentation IRestResponse personnalisée?
jpgrassi

2
Parce que j'ai utilisé Restsharp pour la dernière fois à peu près au même moment où les épaulettes étaient en vogue, les téléphones à cadran étaient la norme et nous avons tous adoré accéder à notre BBS préféré via notre modem Robotics 14.4k. Coche verte de réponse-approbation, je le ferai.
Pure.Krome

3

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 comme 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
}

9
En utilisant, Waitvous n'utilisez pas le code asynchrone, vous l'exécutez simplement de manière synchrone.
The Muffin Man

Dans mon cas, appeler ExecuteTaskAsynk (avec ou sans le jeton d'annulation) ne revient pas et rend IIS irresponsable. J'ai dû utiliser ce HACK jusqu'à ce que je trouve la cause.
Alex 75

si vous attendez pourquoi n'utilisez-vous pas simplement la version de synchronisation de l'appel ... inutile
Egli Becerra

1
N'êtes-vous pas en train de libérer le Thread pour être utilisé ailleurs? Sur une opération de longue durée à l'autre bout, c'est bénéfique, non?
benmccallum

oui, la sortie est venue, si la réponse est valide, Suis-je en train de réaliser l'opération Async.
Prince Antony G
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.