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).
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:
privatestaticasyncvoidMain(){var client =newRestClient();var request =newRestRequest("http://www.google.com");var cancellationTokenSource =newCancellationTokenSource();var restResponse =await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);// Will output the HTML contents of the requested pageConsole.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).
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.
privatestaticasyncvoidMain(){var client =newRestClient();var request =newRestRequest("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}
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.
Dalam kasus saya, saya harus memanggil Task.Wait () agar berfungsi dengan benar. Namun, saya menggunakan versi yang tidak menggunakan CancellationTokenSource sebagai parameter.
sumber
Wait
Anda tidak memanfaatkan kode asinkron, Anda hanya menjalankannya secara sinkron.