我們有一個大型的庫,它使用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. 角色js異步調用MVC控制器不是異步
- 2. ASP.NET MVC 4異步控制器回調
- 3. Grails控制器中的異步調用
- 4. ASP.NET MVC中的異步控制器
- 5. 異步控制器asp.net的MVC 2.0
- 6. ASP.NET MVC中的異步控制器
- 7. ASP.NET MVC中的異步控制器
- 8. 是否是自動異步的Asp MVC異步控制器操作?
- 9. 異步控制器
- 10. 使用嵌套異步方法調試異步MVC操作控制器
- 11. ASP.NET異步控制器和調用Sync();什麼是「同步()」?
- 12. 異步Asp.Net MVC控制器方法?
- 13. 保留MVC異步控制器方法
- 14. MVC異步控制器操作
- 15. ASP.NET MVC異步控制器與NHibernate
- 16. 檢測MVC中的同步和異步控制器操作4
- 17. 從MVC「控制器到WEB API控制器」的調用方法異步?
- 18. 異步調用中的控制流程
- 19. 異步控制器行爲
- 20. 異步控制器或Ajax?
- 21. mvc3異步控制器
- 22. 網絡上的.NET異步 - 必須帶有異步控制器嗎?
- 23. 異步控制器是否可行?
- 24. MVC 4中的Task.Factory.StartNew與異步控制器與Service Broker Activation的異步控制器
- 25. 總是在ASP.NET MVC控制器中使用異步
- 26. 異步調用和異步io調用之間的差異.net
- 27. 是forEach()異步嗎?
- 28. 是Parse.initialize()異步嗎?
- 29. 控制jQuery異步ajax調用號碼?
- 30. ASP.NET MVC異步控制器異常處理
'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