Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 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
}