2012-03-14 78 views
2

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

+0

'WebClient'不是新的,它至少在.Net 1.1之后就已经存在了。你的意思是'HtppClient',这是.Net 4.5和ASP.NET MVC 4中的新功能吗? – svick 2012-03-15 18:41:46

+0

是的,抱歉让我感到困惑。你说得对,我的意思是新的HttpClient。 – AlexGad 2012-03-16 02:10:20

回答

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,并在C#中使用新的GetResponseAsyncawait的新功能,使生活更轻松了很多赫克:

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

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

啊,非常感谢。我认为这个调用仍然会阻止,并且我从来没有想到WebRequest可能已经被扩展为支持异步,但是肯定的是,浏览这些方法显示了我的答案。谢谢! – AlexGad 2012-03-15 03:23:23