2012-03-14 88 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