Come usare RestSharp con async / await


103

Non riesco a trovare un esempio moderno di codice C # asincrono che utilizza RestSharp con asynce await. So che c'è stato un recente aggiornamento di Haack ma non so come utilizzare i nuovi metodi.

Inoltre, come posso fornire un token di annullamento in modo che l'operazione possa essere annullata (ad esempio, se una persona è stanca di aspettare e preme il pulsante Annulla nell'interfaccia utente dell'app).

Risposte:


202

Bene, l'aggiornamento a cui si riferisce Haack è stato fatto da me :) Quindi lascia che ti mostri come usarlo, in quanto in realtà è molto semplice. In precedenza avevi metodi del genere ExecuteAsyncGetche restituivano un tipo personalizzato RestSharp denominato RestRequestAsyncHandle. Questo tipo non può essere atteso poiché async/awaitfunziona Taske Task<T>restituisce i tipi. La mia richiesta pull ha aggiunto sovraccarichi ai metodi asincroni esistenti che restituiscono Task<T>istanze. Questi Task<T>overload hanno una stringa "Task" aggiunta ai loro nomi, ad esempio viene chiamato l' Task<T>overload per . Per ciascuno dei nuovi overload esiste un metodo che non richiede che venga specificato un e ce n'è uno che lo fa.ExecuteAsyncGetExecuteGetTaskAsync<T>Task<T>CancellationToken

Quindi ora passiamo a un esempio reale su come usarlo, che mostrerà anche come usare a 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); 
}

Questo utilizzerà l' ExecuteTaskAsyncoverload che restituisce Task<IRestResponse>un'istanza. Poiché restituisce a Task, è possibile utilizzare la awaitparola chiave su questo metodo e ottenere restituito il Task<T>tipo restituito (in questo caso IRestResponse).

Puoi trovare il codice qui: http://dotnetfiddle.net/tDtKbL


AH! Penso di io: cuore: tu !! (E molto azzeccato, considerando che è San Valentino). Sarebbe MOLTO bello da aggiungere al wiki di RestSharp. Ok, quindi ... c'è qualche possibilità che ci sia anche un PCL? O sto sfidando la mia fortuna?
Pure.Krome

Non sono sicuro che una versione PCL di questo funzionerebbe, ma lo esaminerò in futuro. E sono d'accordo che sarebbe bello aggiungere al wiki, non so se sono autorizzato a modificarlo (non sono un manutentore regolare della libreria).
Erik Schierboom

Forse possiamo far partecipare @Haacked al convo, magari su Twitter?
Pure.Krome

3
Come posso eseguire il mapping alla mia implementazione IRestResponse personalizzata?
jpgrassi

2
Poiché ho usato Restsharp per l'ultima volta nello stesso periodo in cui gli spallacci erano in voga, i telefoni rotanti erano la norma e tutti noi amavamo colpire la nostra BBS preferita tramite il nostro modem Robotics 14.4k. Segno di spunta verde di approvazione della risposta, lo farò.
Pure.Krome

3

Nel mio caso, ho dovuto chiamare Task.Wait () perché funzionasse correttamente. Tuttavia, ho usato la versione che non accetta CancellationTokenSource come parametro.

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
Utilizzando Waitnon stai sfruttando il codice asincrono, lo stai solo eseguendo in modo sincrono.
The Muffin Man

Nel mio caso la chiamata a ExecuteTaskAsynk (con o senza il token di annullamento) non ritorna e rende l'IIS irresponsabile. Ho dovuto usare questo HACK finché non ho trovato la causa.
Alex 75

se aspetti perché non usi semplicemente la versione di sincronizzazione della chiamata ... inutile
Egli Becerra

1
Non stai però liberando il Thread per essere utilizzato altrove? Su un'operazione di lunga durata dall'altra parte è vantaggioso, no?
benmccallum

sì, l'output è arrivato, se la risposta è valida, sto ottenendo l'operazione Async.
Prince Antony G il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.