我有这段代码:
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解决。
答案 0 :(得分:8)
你可以这样做(在 async 方法中):
backgroundSessionConfiguration
但我建议使用HttpClient
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");
顺便说一句:使用using (var client = new HttpClient())
{
var result = await client.GetStringAsync(URL);
}
MessageBox.Show("Finish");
,您使用的网站所使用的编码可能不是GetStringAsync
答案 1 :(得分:0)
修改强>
为了" 有许多不同的方式"在原始答案中说明,最好考虑使用async / await模式,由 Eser在他的answer中完成,这是更好的答案
当像GetResponseAsync
这样的异步方法执行此类工作时,最好使用它并避免创建任务。
考虑阅读Stephen Cleary的精彩帖子:
<强> ORIGINAL 强>
有许多不同的方法,例如:
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
});
这样,当任务执行时,应用程序将完全响应,并且不再有冻结。
答案 2 :(得分:0)
您可以在System.Net.Http中使用HttpClient(假设.net&gt; 4.5):
HttpClient client = new HttpClient();
var code = client.GetAsync(URL).ContinueWith(x =>
{
MessageBox.Show("finish");
client.Dispose();
});
您应该继续添加一些错误检查以确定。