Como usar RestSharp com async / await


103

Estou lutando para encontrar um exemplo moderno de algum código C # assíncrono que usa RestSharp com asynce await. Eu sei que houve uma atualização recente de Haack, mas não sei como usar os novos métodos.

Além disso, como posso fornecer um token de cancelamento para que a operação possa ser cancelada (por exemplo, se uma pessoa está cansada de esperar e pressiona o botão Cancelar na IU do aplicativo).

Respostas:


202

Bem, a atualização à qual Haack está se referindo foi feita por mim :) Deixe-me mostrar como usá-la, pois na verdade é muito simples. Anteriormente, você tinha métodos como ExecuteAsyncGetesse retornariam um tipo personalizado RestSharp chamado RestRequestAsyncHandle. Este tipo não pode ser esperado como tipos de async/awaittrabalho Taske Task<T>retorno. Minha solicitação pull adicionou sobrecargas aos métodos assíncronos existentes que retornam Task<T>instâncias. Essas Task<T>sobrecargas têm uma string "Tarefa" adicionada a seus nomes, por exemplo, a Task<T>sobrecarga para ExecuteAsyncGeté chamada ExecuteGetTaskAsync<T>. Para cada uma das novas Task<T>sobrecargas, há um método que não exige que um CancellationTokenseja especificado e outro que exige .

Agora vamos a um exemplo real de como usá-lo, que também mostrará como usar 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); 
}

Isso usará a ExecuteTaskAsyncsobrecarga que retorna uma Task<IRestResponse>instância. Como ele retorna a Task, você pode usar a awaitpalavra-chave neste método e obter o Task<T>tipo retornado de (neste caso IRestResponse).

Você pode encontrar o código aqui: http://dotnetfiddle.net/tDtKbL


AH! Acho que eu: coração: você !! (E muito apropriado, considerando que é dia dos namorados). Isso seria MUITO bom para adicionar ao wiki RestSharp. Ok, então .. alguma chance de haver um PCL disso, também? Ou estou abusando da sorte?
Pure.Krome de

Não tenho certeza se uma versão PCL disso funcionaria, mas vou examiná-la no futuro. E eu concordo que seria bom adicionar ao wiki, não sei se tenho permissão para editá-lo (não sou um mantenedor regular da biblioteca).
Erik Schierboom

Talvez possamos obter @Haacked na conversa, talvez no Twitter?
Pure.Krome de

3
Como posso mapear para minha implementação IRestResponse personalizada?
jpgrassi

2
Como usei o Restsharp pela última vez na mesma época em que as ombreiras estavam em voga, os telefones rotativos eram a norma e todos nós adorávamos pegar nosso BBS favorito por meio de nosso modem Robotics 14,4k. Marca verde de resposta-aprovação, eu devo.
Pure.Krome de

3

No meu caso, tive que chamar Task.Wait () para que funcionasse corretamente. No entanto, usei a versão que não leva o CancelamentoTokenSource como parâmetro.

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
Ao usar, Waitvocê não está aproveitando o código assíncrono, apenas o está executando de forma síncrona.
The Muffin Man

No meu caso, chamar ExecuteTaskAsynk (com ou sem o token de cancelamento) não retorna e torna o IIS irresponsivo. Tive que usar este HACK até encontrar a causa.
Alex 75

Se você esperar, por que não usa a versão de sincronização da chamada ... inútil
Egli Becerra

1
Você não está liberando o Thread para ser usado em outro lugar? Em uma operação de longa duração na outra extremidade, isso é benéfico, não?
benmccallum de

sim, veio a resposta, se a resposta é válida, estou conseguindo a operação Async.
Príncipe Antony G
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.