Як користуватися RestSharp з функцією async / wait


103

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

Крім того, як я можу надати маркер скасування, щоб операцію можна було скасувати (скажімо, якщо людині нудно чекати і натиснути кнопку Скасувати в інтерфейсі програми).

Відповіді:


202

Що ж, оновлення Haack має на увазі зроблене мною :) Тож дозвольте мені показати вам, як ним користуватися, оскільки це насправді дуже просто. Раніше у вас були такі способи, ExecuteAsyncGetякі б повернули користувальницький тип RestSharp з назвою RestRequestAsyncHandle. Цього типу не можна було очікувати, оскільки він async/awaitпрацює Taskта Task<T>повертається. Мій запит на додавання додав перевантаження існуючим методам асинхронізації, які повертають Task<T>екземпляри. Ці Task<T>перевантаження мають доданий рядок "Завдання" до їх імен, наприклад, викликається Task<T>перевантаження для . Для кожної з нових перевантажень існує один метод, який не потребує вказівки, і є такий, який є.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


А-а! Я думаю, що я: серце: ти !! (І дуже влучно, враховуючи, що це день Святого Валентина). Це було б ДУЖЕ приємно додати у вікі RestSharp. Добре, так .. будь-який шанс є PCL цього, також? Або я штовхаю свою удачу?
Pure.Krome

Я не впевнений, чи працює ця версія PCL, але я буду розглядати це в майбутньому. І я погоджуюся, що було б непогано додати до вікі, не знаю, чи мені дозволяють її редагувати (я не є постійним обслуговувачем бібліотеки).
Ерік Щербум

Можливо, ми можемо потрапити @Haacked у конво, можливо, у Twitter?
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ви не використовуєте асинхронний код, ви просто запускаєте його синхронно.
Людина-булочка

У моєму випадку виклик ExecuteTaskAsynk (з маркером скасування або без нього) не повертається і робить IIS безвідповідальним. Мені довелося використовувати цей HACK, поки я не знайшов причину.
Алекс 75

якщо ви чекаєте, чому ви просто не використовуєте синхронізовану версію дзвінка ... безглуздо
Egli Becerra

1
Хіба ви не звільняєте Нитку, щоб її використовувати деінде? На тривалій операції на іншому кінці це вигідно, ні?
benmccallum

так, прийшов результат, чи правдива відповідь, чи я досягаю операції Async.
Принц Антоній G
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.