理解await關鍵字之後的執行緒行為
在非同步程式設計中,await關鍵字在管理執行緒和確保高效執行方面起著至關重要的作用。然而,理解遇到await後程式碼如何繼續進行可能會令人困惑。本文旨在透過詳細的探索來闡明這一點。
以以下程式碼片段為例:
private async Task MyAsyncMethod() { // Code before await await MyOtherAsyncMethod(); // Code after await } private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); }
當 MyAsyncMethod 中遇到 wait 關鍵字時,控制權會傳回給 MyMethod。這是因為 MyAsyncMethod 被標記為非同步。然而,由於隨後呼叫了task.Wait(),執行MyMethod的執行緒被阻塞,似乎阻止了await後程式碼的執行。
新執行緒會執行await後的程式碼嗎?
答案是:也許吧。此行為取決於等待表達式求值時「當前」的同步上下文的實作。
在提供的範例中,如果程式碼在 UI 執行緒上運行,則延續(程式碼在await之後)將在同一個UI執行緒上執行。另一方面,如果程式碼在執行緒池執行緒上運行,則可以在任何可用的執行緒池執行緒上執行延續。
避免執行緒阻塞
如果目標是立即執行await之後的程式碼,那麼避免使用task.Wait()或task.Result阻塞執行緒至關重要。相反,請考慮其他選項,例如註冊回調或使用等待任務本身。
控制執行緒親和性
對於延續需要特定執行緒親和性的場景,可以使用ConfigureAwait方法。透過將 false 傳遞給ConfigureAwait,可以明確指示延續在不同的執行緒上下文上運行。
其他資源
為了加深對await 的線程行為的理解,請參閱以下資源:
以上是C# 非同步程式設計中的「await」關鍵字後執行緒會發生什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!