调用WebResponse的MVC异步控制器仍然是异步的吗?
我们有一个大型的库,它使用HttpWebRequest获取数据来进行大量的HTTP调用。重写这个库以利用HTTPClient的异步调用将是一个熊。所以,我想知道是否可以创建使用taskfactory调用我们的库的异步控制器,以及最终通过WebClient创建的调用是异步还是同步。是否有任何问题/副作用,我可能通过尝试混合异步与旧的HttpWebRequest?调用WebResponse的MVC异步控制器仍然是异步的吗?
如果我理解你的建议,答案是:不,更改客户端与异步服务器交互的服务不会有帮助。当服务器的I/O未完成时,客户端仍然会阻塞CPU线程,无论服务器是否为异步。
没有理由离开HttpWebRequest
。您可以在.NET 4.0中使用TaskFactory::FromAsync
来调用HttpWebRequest::BeginGetResponse
。这看起来是这样的:
WebRequest myWebRequest = WebRequest.Create("http://www.*.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
,并在C#中使用新的GetResponseAsync
法await
的新功能,使生活更轻松了很多赫克:
WebRequest myWebRequest = WebRequest.Create("http://www.*.com");
using(WebResponse webResponse = await myWebRequest.GetResponseAsync())
using(Stream webResponseStream = webResponse.GetResponseStream())
{
// read from stream async, etc.
}
啊,非常感谢。我认为这个调用仍然会阻止,并且我从来没有想到WebRequest可能已经被扩展为支持异步,但是肯定的是,浏览这些方法显示了我的答案。谢谢! – AlexGad 2012-03-15 03:23:23
'WebClient'不是新的,它至少在.Net 1.1之后就已经存在了。你的意思是'HtppClient',这是.Net 4.5和ASP.NET MVC 4中的新功能吗? – svick 2012-03-15 18:41:46
是的,抱歉让我感到困惑。你说得对,我的意思是新的HttpClient。 – AlexGad 2012-03-16 02:10:20