Cara menggunakan RestSharp dengan async / await


103

Saya berjuang untuk menemukan contoh modern dari beberapa kode C # asinkron yang menggunakan RestSharp dengan asyncdan await. Saya tahu ada pembaruan terkini oleh Haack tetapi saya tidak tahu bagaimana menggunakan metode baru.

Juga, bagaimana saya bisa memberikan token pembatalan sehingga operasi bisa dibatalkan (katakanlah, jika seseorang muak menunggu dan menekan tombol Batal di UI aplikasi).

Jawaban:


202

Nah, pembaruan yang dimaksud Haack telah dibuat oleh saya :) Jadi izinkan saya menunjukkan cara menggunakannya, karena sebenarnya sangat sederhana. Sebelumnya Anda memiliki metode seperti ExecuteAsyncGetitu yang akan mengembalikan tipe kustom RestSharp bernama RestRequestAsyncHandle. Jenis ini tidak bisa ditunggu sebagai jenis async/awaitkarya Taskdan Task<T>jenis pengembalian. Permintaan tarik saya menambahkan beban berlebih ke metode asinkron yang ada yang mengembalikan Task<T>instance. Ini Task<T>overloads memiliki menambahkan "Task" string ditambahkan ke nama mereka, misalnya Task<T>kelebihan untuk ExecuteAsyncGetdisebut ExecuteGetTaskAsync<T>. Untuk setiap Task<T>kelebihan beban baru, ada satu metode yang tidak memerlukan a CancellationTokenuntuk ditentukan dan ada satu metode yang memerlukannya .

Jadi sekarang ke contoh aktual tentang cara menggunakannya, yang juga akan menunjukkan cara menggunakan 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); 
}

Ini akan menggunakan ExecuteTaskAsynckelebihan beban yang mengembalikan sebuah Task<IRestResponse>instance. Karena mengembalikan a Task, Anda dapat menggunakan awaitkata kunci pada metode ini dan mendapatkan Task<T>kembali jenis yang dikembalikan (dalam kasus ini IRestResponse).

Anda dapat menemukan kodenya di sini: http://dotnetfiddle.net/tDtKbL


AH! Saya pikir saya: hati: Anda !! (Dan sangat tepat, mengingat ini hari Valentine). Ini akan SANGAT bagus untuk ditambahkan ke wiki RestSharp. Ok, jadi .. apakah ada kemungkinan PCL ini juga? Atau apakah saya mendorong keberuntungan saya?
Pure.Krome

Saya tidak yakin apakah versi PCL ini akan berfungsi, tetapi saya akan memeriksanya di masa mendatang. Dan saya setuju akan menyenangkan untuk menambahkan ke wiki, tidak tahu apakah saya diizinkan untuk mengeditnya (saya bukan pengelola perpustakaan biasa).
Erik Schierboom

Mungkin kita bisa memasukkan @Haacked ke obrolan, mungkin di Twitter?
Pure.Krome

3
Bagaimana cara memetakan ke implementasi IRestResponse kustom saya?
jpgrassi

2
Karena saya terakhir kali menggunakan Restsharp sekitar waktu yang sama bantalan bahu sedang populer, telepon putar adalah hal yang biasa dan kami semua senang menggunakan BBS favorit kami melalui modem Robotics 14.4k kami. Centang hijau persetujuan jawaban, saya akan.
Pure.Krome

3

Dalam kasus saya, saya harus memanggil Task.Wait () agar berfungsi dengan benar. Namun, saya menggunakan versi yang tidak menggunakan CancellationTokenSource sebagai parameter.

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
Dengan menggunakan WaitAnda tidak memanfaatkan kode asinkron, Anda hanya menjalankannya secara sinkron.
The Muffin Man

Dalam kasus saya, memanggil ExecuteTaskAsynk (dengan atau tanpa token pembatalan) tidak kembali dan membuat IIS tidak responsif. Saya harus menggunakan HACK ini sampai saya menemukan penyebabnya.
Alex 75

jika Anda menunggu mengapa Anda tidak menggunakan versi sinkronisasi panggilan ... tidak berarti
Egli Becerra

1
Bukankah Anda membebaskan Thread untuk digunakan di tempat lain? Di sisi lain, operasi jangka panjang itu menguntungkan, bukan?
benmccallum

ya, keluaran datang, apakah jawabannya valid, Apakah saya mencapai operasi Async.
Pangeran Antony G
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.