RestSharp'ı async / await ile kullanma


103

RestSharp'ı asyncve ile birlikte kullanan bazı zaman uyumsuz C # kodunun modern bir örneğini bulmakta zorlanıyorum await. Orada biliyorum Haack tarafından yapılan son güncelleme olmuş ama yeni yöntemler kullanmaya nasıl bilmiyorum.

Ayrıca, işlemin iptal edilebilmesi için nasıl bir iptal jetonu sağlayabilirim (örneğin, bir kişi beklemekten bıktıysa ve uygulamanın kullanıcı arayüzündeki İptal düğmesine basarsa).

Yanıtlar:


202

Haack'ın bahsettiği güncelleme benim tarafımdan yapıldı :) Bu yüzden size nasıl kullanılacağını göstereyim, çünkü aslında çok basit. Daha önce, böyle ExecuteAsyncGetbir RestSharp özel türü döndüren yöntemler vardı RestRequestAsyncHandle. Bu tür, async/awaitçalışma Taskve Task<T>dönüş türleri olarak beklenemezdi . Çekme isteğim, Task<T>örnekleri döndüren mevcut zaman uyumsuz yöntemlere aşırı yükler ekledi . Bu Task<T>aşırı yüklemelerin adlarına eklenen bir "Görev" dizesi vardır, örneğin Task<T>aşırı yükleme ExecuteAsyncGetçağrılır ExecuteGetTaskAsync<T>. Yeni Task<T>aşırı yüklerin her biri için, a'nın CancellationTokenbelirtilmesini gerektirmeyen bir yöntem vardır ve bunu yapan bir tane vardır.

Şimdi, nasıl kullanılacağına dair gerçek bir örneğe geçelim, bu da a'nın nasıl kullanılacağını gösterecek 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); 
}

Bu, ExecuteTaskAsyncbir Task<IRestResponse>örnek döndüren aşırı yüklemeyi kullanacaktır . A döndürdüğünde Task, awaitanahtar kelimeyi bu yöntemde kullanabilir ve Task<T>döndürülen türü (bu durumda IRestResponse) döndürebilirsiniz .

Kodu burada bulabilirsiniz: http://dotnetfiddle.net/tDtKbL


AH! Sanırım ben: kalp: sen !! (Ve Sevgililer Günü olduğunu düşünürsek çok uygun). Bunu RestSharp wiki'ye eklemek ÇOK güzel olurdu. Tamam, yani .. bunun bir PCL olma ihtimali var mı? Yoksa şansımı zorluyor muyum?
Pure.Krome

Bunun bir PCL sürümünün işe yarayıp yaramayacağından emin değilim, ancak gelecekte bununla ilgileneceğim. Ve wiki'ye eklemenin güzel olacağını kabul ediyorum, onu düzenlememe iznim var mı bilmiyorum (kütüphanenin düzenli bir bakıcısı değilim).
Erik Schierboom

Belki konvoya @Haacked girebiliriz, belki Twitter'da?
Pure.Krome

3
Özel IRestResponse uygulamama nasıl eşleyebilirim?
jpgrassi

2
Restsharp'ı en son aynı zamanlarda kullandığım için, omuz pedleri moda oldu, döner telefonlar normdu ve hepimiz Robotics 14.4k modemimiz aracılığıyla fav BBS'mize ulaşmayı sevdik. Cevap onayının yeşil tik işareti, yapacağım.
Pure.Krome

3

Benim durumumda, düzgün çalışması için Task.Wait () 'i çağırmak zorunda kaldım. Ancak ben CancellationTokenSource'u parametre olarak almayan sürümü kullandım.

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
Kullanarak Waitsize zaman uyumsuz kodunu yararlanarak değiliz, sadece eşzamanlı olarak azalıyor.
Kek Adam

Benim durumumda ExecuteTaskAsynk'i çağırmak (iptal belirteci olsun veya olmasın) geri dönmüyor ve IIS'yi tepkisiz hale getiriyor. Nedeni bulana kadar bu HACK'i kullanmak zorunda kaldım.
Alex 75

beklerseniz neden aramanın senkronizasyon sürümünü kullanmıyorsunuz ... anlamsız
Egli Becerra

1
İpliği başka bir yerde kullanılmak üzere serbest bırakmıyor musunuz? Diğer taraftan uzun süren bir operasyonda bu faydalı, değil mi?
benmccallum

evet, çıktı geldi, cevabın geçerli olup olmadığı, Async işlemini gerçekleştiriyor muyum.
Prince Antony G
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.