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.