2017-04-05 57 views
0

我徘徊是否.Net HttpClientasync方法運行在新線程或主要的方法。將HttpClient異步方法運行在新線程

例如,在我的控制檯應用程序中,我使用HttpClient.GetStringAsync方法調用async方法來下載URL內容。

這個方法(GetStringAsync)會在新的獨立線程中運行嗎?

+3

我建議你閱讀這個問題:http://stackoverflow.com/q/37419572/5311735並回答結束。簡而言之 - 如果不檢查源代碼(或者除非在文檔中提及它),則無法確切說明。 – Evk

回答

4

通常,異步I/O方法不使用單獨的線程。我在我的博客文章There Is No Thread中詳細解釋了這一點。

但是,在這個特定的情況下,這不完全正確。基於.NET的WebRequest基於.NET的API長期支持異步操作,但實際上通過它們的異步API實際上始終完成了HTTP代理檢測和DNS查找,作爲同步。當HttpClient開始流行時,這被發現。不幸的是,微軟決定而不是來解決這些長期存在的錯誤。

因此,HttpClient在線程池線程中包裝它的WebRequest調用。請注意,它仍然使用「異步」API,因此只有同步部分(HTTP代理和DNS查找)在線程池線程上完成;其餘的請求是真正異步的。至少,這對於某些平臺是正確的。

+0

我在看這個例子https://msdn.microsoft.com/en-ca/library/mt674882.aspx。幸運的是,有HttpClient的例子。在那個鏈接中,有一個叫做Thread的部分,他們提到在async-await上下文中不會創建額外的線程。你認爲這部分與這個例子無關嗎? – Mhd

+0

'異步和等待關鍵字不會導致創建額外的線程。「 - 該語句完全正確。 'async'和'await'都不會創建新線程。 –

0

不需要。因爲使用async/await主要是爲了異步執行IO綁定任務而不創建新線程而創建的。只有在CPU綁定的任務中才會創建新的線程。

+0

有關此聲明的任何證據鏈接? – cassandrad

+0

C#考試編程70-483 – DigheadsFerke

+0

http://blog.stephencleary.com/2013/11/there-is-no-thread.html –