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).
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:
privatestaticasyncvoidMain(){var client =newRestClient();var request =newRestRequest("http://www.google.com");var cancellationTokenSource =newCancellationTokenSource();var restResponse =await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);// Will output the HTML contents of the requested pageConsole.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).
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.
privatestaticasyncvoidMain(){var client =newRestClient();var request =newRestRequest("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}
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.
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.
la source
Wait
vous n'utilisez pas le code asynchrone, vous l'exécutez simplement de manière synchrone.