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

103

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

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

Pure.Krome
источник

Ответы:

202

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

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

Эрик Ширбум
источник
А! Думаю я: heart: ты !! (И очень удачно, учитывая, что сегодня День Святого Валентина). Это было бы ОЧЕНЬ неплохо добавить в вики RestSharp. Хорошо, так ... есть ли шанс, что это тоже PCL? Или я испытываю удачу?
Pure.Krome
Я не уверен, что это будет работать с версией PCL, но я изучу это в будущем. И я согласен, что было бы неплохо добавить в вики, не знаю, разрешено ли мне редактировать ее (я не регулярно поддерживаю библиотеку).
Эрик Ширбум,
Может быть, мы сможем получить @Haacked в колонну, может быть, в Твиттере?
Pure.Krome
3
Как я могу сопоставить свою собственную реализацию IRestResponse?
jpgrassi
2
Поскольку в последний раз я использовал Restsharp примерно в то же время, когда наплечники были в моде, роторные телефоны были нормой, и всем нам нравилось подключаться к нашей любимой BBS через модем Robotics 14.4k. Зеленая галочка ответа-одобрения, буду.
Pure.Krome
3

В моем случае мне пришлось вызвать 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
}
Рам Джаяраман
источник
9
Используя Waitвы не используете асинхронный код, вы просто запускаете его синхронно.
The Muffin Man
В моем случае вызов ExecuteTaskAsynk (с токеном отмены или без него) не возвращает и делает IIS безответным. Я должен был использовать этот ХАК, пока не нашел причину.
Alex 75
если вы подождете, почему бы вам просто не использовать синхронизирующую версию вызова ... бессмысленно
Эгли Бесерра
1
Разве вы не освобождаете поток для использования в другом месте? На другом конце длительной операции это выгодно, не так ли?
benmccallum
да, пришел вывод, верен ли ответ, Выполняю ли я операцию Async.
Prince Antony G