2014-02-14 1 views
58

Я изо всех сил пытаюсь найти современный пример некоторого асинхронного кода на C#, который использует RestSharp с async и await. Я знаю, что есть been a recent update by Haack, но я не знаю, как использовать новые методы.Как использовать RestSharp с async/await

Кроме того, как я могу предоставить токен отмены, чтобы операция могла быть отменена (скажем, если человек устал ждать и нажимает кнопку «Отмена» в пользовательском интерфейсе приложения).

ответ

109

Ну, обновление Haack имеет отношение к тому, что было сделано мной :) Итак, позвольте мне показать вам, как его использовать, поскольку на самом деле это очень просто. Раньше у вас были такие методы, как ExecuteAsyncGet, которые возвращают настраиваемый тип RestSharp с именем RestRequestAsyncHandle. Этот тип не ожидал, так как async/await работает на Task и Task<T> типах возвратов. Мой pull-request добавил перегрузки к существующим методам async, которые возвращают Task<T> экземпляров. Эти перегрузки Task<T> имеют добавленную строку «Задача», добавленную к их именам, например, перегрузка Task<T> для ExecuteAsyncGet называется ExecuteGetTaskAsync<T>. Для каждой из новых перегрузок Task<T> существует один метод, который не требует указания CancellationToken, и есть тот, который делает.

Так что теперь на конкретный пример о том, как использовать его, который будет также показать, как использовать 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); 

    Console.WriteLine(restResponse.Content); // Will output the HTML contents of the requested page 
} 

Это будет использовать ExecuteTaskAsync перегрузки, которая возвращает Task<IRestResponse> экземпляра. Когда он возвращает Task, вы можете использовать ключевое слово await по этому методу и получить возвращаемый тип Task<T> (в данном случае IRestResponse).

Вы можете найти код здесь: http://dotnetfiddle.net/tDtKbL

+0

AH! Я думаю, я: сердце: ты! (И очень уместно, учитывая, что это День Святого Валентина). Это было бы очень приятно добавить в Wiki RestSharp. Ладно, так .. любой шанс есть PCL этого, также? Или я толкаю свою удачу? –

+0

Я не уверен, что версия PCL будет работать, но я буду изучать ее в будущем. И я согласен, что было бы неплохо добавить к вики, не знаю, разрешено ли мне редактировать его (я не являюсь постоянным хранителем библиотеки). –

+0

Может быть, мы сможем получить @Haacked в convo, возможно, в Twitter? –

2

В моем случае, я должен был назвать Task.Wait() для того, чтобы работать должным образом. Тем не менее, я использовал версию, которая не принимает параметр CancellationTokenSource в качестве параметра.

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 
} 
+3

С помощью 'Wait' вы не используете асинхронный код, вы просто запускаете его синхронно. –

+0

В моем случае вызов ExecuteTaskAsynk (с токеном отмены или без него) не возвращается и делает IIS безответственным. Я должен был использовать этот HACK, пока не нашел причину. –