我是TPL的新手,我想知道:C#5.0新增的異步編程支持(通過新的async
和await
關鍵字)如何與創建線程相關?使用異步/等待創建新線程嗎?
具體來說,每次使用async/await
時,都會使用它們嗎?如果有很多使用async/await
的嵌套方法,是否爲每個方法創建了一個新的線程?
我是TPL的新手,我想知道:C#5.0新增的異步編程支持(通過新的async
和await
關鍵字)如何與創建線程相關?使用異步/等待創建新線程嗎?
具體來說,每次使用async/await
時,都會使用它們嗎?如果有很多使用async/await
的嵌套方法,是否爲每個方法創建了一個新的線程?
總之NO
從Asynchronous Programming with Async and Await : Threads
異步和等待關鍵字不會造成額外的線程是 創建。異步方法不需要多線程,因爲異步方法不會在其自己的線程上運行。該方法在當前的 同步上下文上運行,並僅在 方法處於活動狀態時纔在線程上使用時間。您可以使用Task.Run將CPU綁定的工作移動到後臺線程,但後臺線程無助於僅等待結果可用的進程 。
無論我看過多少次這個問題,我仍然不明白。 「異步方法不需要多線程,因爲異步方法不能在自己的線程上運行」Ergo - >另一個線程。它怎麼可能呢? – dudeNumber4 2016-10-18 15:11:53
並非每個操作都需要一個線程。典型系統上有許多處理器/控制器,包括磁盤控制器,網卡控制器,GPU等等。他們只需要從處理器接收命令。然後他們繼續執行命令並在完成時告訴處理器(通過中斷它或其他機制來通知它)。在此之前,沒有涉及任何線程。發佈線程可以進入睡眠狀態或轉到可以重用的線程池。命令完成後,程序執行可能會繼續執行休眠線程或線程池線程。 – Vakho 2016-12-15 20:32:30
如果async/await方法是一個cpu綁定方法,該怎麼辦?Task.Run用於處理長時間運行的進程,在這種情況下asycn需要新線程,否? – 2016-12-25 14:50:31
取決於您使用'await'調用的方法是如何實現的。你應該閱讀http://blog.stephencleary.com/2013/11/there-is-no-thread.html但要警告。 *我們將深潛。* – MarcinJuraszek 2014-12-03 07:19:54
不,例如請參閱http://stackoverflow.com/a/27071434/876814 – 2014-12-03 09:53:29