我们有一个大型的库,它使用HttpWebRequest获取数据来进行大量的HTTP调用。重写这个库以利用HTTPClient的异步调用将是一个熊。所以,我想知道是否可以创建使用taskfactory调用我们的库的异步控制器,以及最终通过WebClient创建的调用是异步还是同步。是否有任何问题/副作用,我可能通过尝试混合异步与旧的HttpWebRequest?调用WebResponse的MVC异步控制器仍然是异步的吗?
2
A
回答
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#中使用新的GetResponseAsync
法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.
}
+0
啊,非常感谢。我认为这个调用仍然会阻止,并且我从来没有想到WebRequest可能已经被扩展为支持异步,但是肯定的是,浏览这些方法显示了我的答案。谢谢! – AlexGad 2012-03-15 03:23:23
相关问题
- 1. Grails控制器中的异步调用
- 2. ASP.NET MVC中的异步控制器
- 3. ASP.NET MVC中的异步控制器
- 4. 异步控制器asp.net的MVC 2.0
- 5. 异步控制器
- 6. ASP.NET异步控制器和调用Sync();什么是“同步()”?
- 7. ASP.NET MVC异步控制器与NHibernate
- 8. mvc3异步控制器
- 9. 总是在ASP.NET MVC控制器中使用异步
- 10. 异步调用和异步io调用之间的差异.net
- 11. 控制jQuery异步ajax调用号码?
- 12. ASP.NET MVC异步控制器异常处理
- 13. 是forEach()异步吗?
- 14. 是Parse.initialize()异步吗?
- 15. ftruncate()是异步的吗?
- 16. jooq流是异步的吗?
- 17. Redis:PUBLISH是异步的吗?
- 18. Graphics.DrawImage是异步的吗?
- 19. HomeController中的异步控制器/索引
- 20. 浏览器通过异步控制器进行的Ajax调用
- 21. 仍然不了解NodeJs异步函数
- 22. $ .ajax({async:false})请求仍然异步启动?
- 23. 这是异步调用同步方法的正确方法吗?
- 24. RestEasy异步控制器正确使用
- 25. 异步函数进行异步调用
- 26. Anko异步API调用异步
- 27. 如何从非异步方法异步调用异步方法
- 28. 使异步调用同步
- 29. 触发器是异步的吗?
- 30. C#异步套接字 - 总是调用异步回调?
'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