[英]Does await completely blocks the thread?
當我們在代碼中使用await時,通常awaiters捕獲上下文並在等待的任務成功完成時將其用作回調。 但是,由於await通常是No.Op(無操作),它是否會使得底層線程在可以等待任務完成之前不可重用?
例如
public async Task MethodAAsync()
{
// Execute some logic
var test = await MethodB();
// Execute Remaining logic.
}
在這里,由於我需要將結果繼續進行,我需要等待。 但是,既然我們正在等待,它是否會阻止底層線程導致線程不被用於執行任何任務?
但是,由於await通常是No.Op(無操作),它是否會使得底層線程在可以等待任務完成之前不可重用?
我不確定你從哪里獲得這些信息,但await
肯定不是No-Op 。 例如,對Task
調用await
將調用對Task.GetAwaiter
的邏輯調用,其中TaskAwaiter
必須實現INotifyCompletion
或ICriticalNotifyCompletion
接口,該接口告訴編譯器如何調用continuation(第一次await
之后的所有內容)。
async-await
的完整結構將您的調用轉換為狀態機,這樣當狀態機命中第一個await
,它將首先檢查被調用的方法是否已完成,如果沒有則將注冊延續並從中返回方法調用。 之后,一旦該方法完成,它將重新進入狀態機以完成該方法。 從邏輯上講,這是你在await
被擊中之后看到的線條。
但是,既然我們正在等待,它是否會阻止底層線程導致線程不被用於執行任何任務?
不,創建一個僅阻止調用線程的整個機制將毫無用處。 async-await
允許您實際將調用線程返回給調用者,這允許他繼續在同一個線程上執行,而運行時負責排隊並調用完成。
簡而言之,不,它不會阻止你的線程。
更多信息: http : //blog.stephencleary.com/2013/11/there-is-no-thread.html
該線程具有任務的本地隊列。 一旦它命中await
它將從它的隊列中獲取另一個任務(假設所有方法都在awaited
它的堆棧)。 如果隊列為空,它將嘗試從全局隊列中獲取任務,如果它也是空的 - 線程將嘗試從另一個線程自己的本地隊列獲取任務。 在一個簡單的程序中,所有線程都可能“脫離任務” - 線程將保持空閑狀態,直到其中一個任務返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.