[英]C# How to make this HttpRequest Async?
我有以下代碼:
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL);
using (WebResponse myResponse = myRequest.GetResponse())
{
using (StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8))
{
result = sr.ReadToEnd();
}
}
我想要完成此請求,運行以下代碼:
MessageBox.Show("Finish");
另外,當我運行此代碼時,我的程序將凍結。 我認為這個問題可以通過異步HttpWebRequest解決。
您可以這樣做(在異步方法中):
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL);
using (WebResponse myResponse = await myRequest.GetResponseAsync())
{
using (StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8))
{
result = sr.ReadToEnd();
}
}
MessageBox.Show("Finish");
但是我建議使用HttpClient
using (var client = new HttpClient())
{
var result = await client.GetStringAsync(URL);
}
MessageBox.Show("Finish");
順便說一句:通過使用GetStringAsync
您使用您的網站使用的編碼,它可能不是UTF8
編輯
為了在原始答案中陳述“ 有許多不同的方式 ”,最好考慮使用由Eser在他的答案中完成的異步/等待模式, 這是更好的答案
當有諸如GetResponseAsync
類的異步方法來執行此類工作時,最好使用它並避免創建任務。
考慮閱讀Stephen Cleary的重要文章:
原版的
有很多不同的方法,例如:
string url= "http://www.google.com";
string result = "";
Task.Run(() =>
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
using (WebResponse myResponse = myRequest.GetResponse())
{
using (StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8))
{
result = sr.ReadToEnd();
}
}
}).ContinueWith(x =>
{
//MessageBox.Show(result);
MessageBox.Show("Finished");
//here you can not easily set properties of form
//you should use Invoke pattern
});
這樣,應用程序將在任務執行時完全響應,並且不再凍結。
您可以為此在System.Net.Http中使用HttpClient(假設.net> 4.5):
HttpClient client = new HttpClient();
var code = client.GetAsync(URL).ContinueWith(x =>
{
MessageBox.Show("finish");
client.Dispose();
});
為了確保繼續,您應該添加一些錯誤檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.