簡體   English   中英

是否等待完全阻止線程?

[英]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必須實現INotifyCompletionICriticalNotifyCompletion接口,該接口告訴編譯器如何調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM