C#如何使这个HttpRequest异步?

时间:2015-09-11 18:41:51

标签: c# asynchronous

我有这段代码:

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解决。

3 个答案:

答案 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();
});

您应该继续添加一些错误检查以确定。