Bagaimana saya bisa menggunakan HttpWebRequest (.NET, C #) secara tidak sinkron?
c#
.net
asynchronous
httprequest
Jason
sumber
sumber
Jawaban:
Menggunakan
HttpWebRequest.BeginGetResponse()
Fungsi panggilan balik dipanggil saat operasi asinkron selesai. Anda harus setidaknya menelepon
EndGetResponse()
dari fungsi ini.sumber
webRequest.Proxy = null
untuk mempercepat permintaan secara dramatis.Mempertimbangkan jawabannya:
Anda dapat mengirim pointer permintaan atau objek lain seperti ini:
Salam pembuka
sumber
Semua orang sejauh ini salah, karena
BeginGetResponse()
beberapa bekerja pada utas saat ini. Dari dokumentasi :Jadi untuk melakukan ini dengan benar:
Anda kemudian dapat melakukan apa yang perlu dilakukan dengan respons. Sebagai contoh:
sumber
Sejauh ini cara termudah adalah dengan menggunakan TaskFactory.FromAsync dari TPL . Ini benar-benar beberapa baris kode ketika digunakan bersama dengan kata kunci async / menunggu baru :
Jika Anda tidak dapat menggunakan kompiler C # 5 maka hal di atas dapat dilakukan dengan menggunakan metode Task.ContinueWith :
sumber
Saya akhirnya menggunakan BackgroundWorker, itu pasti asinkron tidak seperti beberapa solusi di atas, ia menangani kembali ke utas GUI untuk Anda, dan sangat mudah dimengerti.
Ini juga sangat mudah untuk menangani pengecualian, karena mereka berakhir di metode RunWorkerCompleted, tetapi pastikan Anda membaca ini: Pengecualian yang tidak ditangani di BackgroundWorker
Saya menggunakan WebClient tetapi jelas Anda bisa menggunakan HttpWebRequest.GetResponse jika Anda mau.
sumber
sumber
.NET telah berubah sejak banyak jawaban ini diposkan, dan saya ingin memberikan jawaban yang lebih mutakhir. Gunakan metode async untuk memulai
Task
yang akan berjalan di utas latar:Untuk menggunakan metode async:
Memperbarui:
Solusi ini tidak berfungsi untuk aplikasi UWP yang menggunakan
WebRequest.GetResponseAsync()
alih-alihWebRequest.GetResponse()
, dan tidak memanggilDispose()
metode yang sesuai. @dragansr memiliki solusi alternatif yang baik yang mengatasi masalah ini.sumber
WebRequest.GetResponseAsync()
danStreamReader.ReadToEndAync()
perlu digunakan dan ditunggu.sumber