[英]The async and await keywords don't cause additional threads to be created?
我糊塗了。 一個或多個Task
如何在一個線程上並行運行? 我對並行性的理解顯然是錯誤的。
MSDN的比特我無法理解:
async和await關鍵字不會導致創建其他線程。 異步方法不需要多線程,因為異步方法不能在自己的線程上運行。 該方法在當前同步上下文上運行,並僅在方法處於活動狀態時在線程上使用時間。
..和:
在啟動任務和等待任務之間,您可以啟動其他任務。 其他任務隱式並行運行,但不會創建其他線程。
它們並不是並行運行,而是輪流運行。 當正在運行的任務阻止進度時,它會將其狀態和控制權存儲到就緒任務中。 這是合作的多任務處理,而不是真正的並行性。
線程根據樣本原理運行。 但是,我想強調幾個關鍵的區別。
首先,僅僅因為async
/ await
不是OS線程:
其次,行為的差異:
async
/ await
使用協作式多任務處理,Win32線程使用搶占式。 因此,所有阻塞操作必須使用async
/ await
模型明確地產生控制。 因此,您可以通過對未編寫為yield的函數進行阻塞調用來阻止整個線程及其所有任務。 正如Stephen在評論中指出的那樣,如果使用多線程同步上下文,則可以在多個OS線程中同時執行(以及所有復雜性和潛在的競爭條件)。 但是MSDN引用是關於單線程上下文的情況。
最后,在其他地方使用相同的設計范例,您可以通過研究這些來學習很多關於async
/ await
的良好實踐:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.