调用WebResponse的MVC异步控制器是否仍然是异步的?

时间:2012-03-14 16:32:01

标签: asp.net-mvc task-parallel-library

我们有一个大型库,它使用HttpWebRequest进行大量HTTP调用来获取数据。重写此库以使用与HTTPClient的异步调用将是一个熊。所以,我想知道我是否可以创建使用taskfactory调用我们的库的异步控制器,以及最终通过WebClient进行的调用是异步还是仍然是同步的。尝试将异步与旧的HttpWebRequest混合,是否会出现任何问题/副作用?

1 个答案:

答案 0 :(得分:6)

如果我理解你提出的建议答案是:不,改变客户谈到的服务是异步的也无济于事。无论服务器是否异步,客户端仍会在服务器的I / O未完成时阻塞CPU线程。

没有理由转离HttpWebRequest。您可以在.NET 4.0中使用TaskFactory::FromAsync来调用HttpWebRequest::BeginGetResponse。看起来像这样:

WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com");

Task<WebResponse> getResponseTask = Task<WebResponse>.Factory.FromAsync(
                                                myWebRequest.BeginGetResponse,
                                                myWebRequest.EndGetResponse,
                                                null);

getResponseTask.ContinueWith(getResponseAntecedent =>
{
   WebResponse webResponse = getResponseAntecedent.Result;

   Stream webResponseStream = webResponse.GetResponseStream();

   // read from stream async too... eventually dispose of it
});

在.NET 4.5中,您仍然继续使用HttpWebRequest并使用新的GetResponseAsync方法与C#中的新await功能一起使用哎很容易:

WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com");

using(WebResponse webResponse = await myWebRequest.GetResponseAsync())
using(Stream webResponseStream = webResponse.GetResponseStream())
{
     // read from stream async, etc.
}