Как использовать RestSharp с async/await

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

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


person Pure.Krome    schedule 14.02.2014    source источник


Ответы (2)


Что ж, обновление, о котором говорит Хаак, было сделано мной :) Итак, позвольте мне показать вам, как его использовать, так как на самом деле это очень просто. Раньше у вас были такие методы, как ExecuteAsyncGet, которые возвращали пользовательский тип RestSharp с именем RestRequestAsyncHandle. Этот тип нельзя было ожидать, так как async/await работает с типами возврата Task и Task<T>. Мой запрос на включение добавил перегрузки к существующим асинхронным методам, которые возвращают 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);

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

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

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

person Erik Schierboom    schedule 14.02.2014
comment
А! Я думаю, что я :heart: ты!! (И очень удачно, учитывая, что это день святого Валентина). Это было бы ОЧЕНЬ приятно добавить в вики RestSharp. Итак, есть ли шанс, что это тоже PCL? Или я испытываю удачу? - person Pure.Krome; 14.02.2014
comment
Я не уверен, что версия PCL будет работать, но я посмотрю на это в будущем. И я согласен, что было бы неплохо добавить в вики, не знаю, разрешено ли мне это редактировать (я не постоянный мейнтейнер библиотеки). - person Erik Schierboom; 14.02.2014
comment
Может быть, мы сможем включить @Haacked в разговор, может быть, в Твиттере? - person Pure.Krome; 14.02.2014
comment
+1. @ErikSchierboom: у меня большой опыт асинхронного PCL. Вы можете пинговать меня, если у вас есть какие-либо вопросы (или просто опубликовать на SO). - person Stephen Cleary; 14.02.2014
comment
@StephenCleary Спасибо! - person Erik Schierboom; 14.02.2014
comment
@ErikSchierboom Знаете ли вы, есть ли способ перенести его на Windows Phone 8? Я не могу найти функцию ExecuteTaskAsync на Windows Phone. - person poiuytrez; 26.08.2014
comment
@poiuytrez Я думаю, что его можно было бы портировать как Windows Phone 8, но, к сожалению, я не уверен. - person Erik Schierboom; 26.08.2014
comment
Как я могу сопоставить свою пользовательскую реализацию IRestResponse? - person jpgrassi; 24.03.2015
comment
Поскольку в последний раз я использовал Restsharp примерно в то же время, когда наплечники были в моде, дисковые телефоны были нормой, и мы все любили подключаться к нашей любимой BBS через наш модем Robotics 14.4k. Зеленая галочка ответа-одобрения, буду. - person Pure.Krome; 15.01.2017
comment
@jpgrassi Прошло довольно много времени, но я сейчас думал о том же. Это можно назвать так: await client.ExecuteTaskAsync<TModel>(request, cancellationTokenSource.Token) где TModel — это класс, который нужно сопоставить с ответом. - person Naomak; 03.10.2017
comment
Спасибо, что поделился. Этот метод делает RestSharp лучше других инструментов управления API. - person André; 29.03.2019
comment
Спасибо! Я пытался выяснить, как заставить RestSharp вызывать асинхронно в моем асинхронном методе. Они не делают это супер ясным в своих методах именования. ExecuteAsync работает не так, как вы думаете. - person Justin; 12.11.2019
comment
Спасибо, что поделились, но я не могу сгенерировать вывод, поэтому я попробовал t.Wait(); затем пришел вывод для моего консольного приложения. Это правильно? - person Prince Antony G; 12.08.2020

В моем случае мне пришлось вызвать 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
}
person Ram Jayaraman    schedule 13.10.2016
comment
Используя Wait, вы не используете асинхронный код, вы просто запускаете его синхронно. - person The Muffin Man; 26.11.2016
comment
В моем случае вызов ExecuteTaskAsynk (с токеном отмены или без него) не возвращает результат и делает IIS не отвечающим. Мне пришлось использовать этот HACK, пока я не нашел причину. - person Alex 75; 09.08.2017
comment
если вы ждете, почему бы вам просто не использовать версию синхронизации вызова ... бессмысленно - person Egli Becerra; 17.07.2018
comment
Разве вы не освобождаете поток для использования в другом месте? При длительной операции на другом конце это выгодно, не так ли? - person benmccallum; 20.07.2018
comment
да, пришел вывод, верный ли ответ, достиг ли я асинхронной операции. - person Prince Antony G; 12.08.2020