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

Ale*_*Gad 2 asp.net-mvc task-parallel-library

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

Dre*_*rsh 6

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

没有理由转离HttpWebRequest.您可以TaskFactory::FromAsync在.NET 4.0中使用来调用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
});
Run Code Online (Sandbox Code Playgroud)

在.NET 4.5中,您仍然可以继续使用HttpWebRequestGetResponseAsync方法并使用awaitC#中的新功能,从而使生活更轻松:

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

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