考慮以下程式碼範例:
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
在此範例中,當使用await關鍵字時在MyAsyncMethod() 中遇到,控制權回傳到MyMethod()。然而,由於task.Wait(),因此線程並沒有被鎖定。相反,延續(await 之後的程式碼)在不同的執行緒上執行。
await 運算子利用同步上下文,它決定應如何執行延續。預設情況下,如果呼叫者在 UI 執行緒上執行,則 continuación 也會在 UI 執行緒上執行。這允許與 UI 操作無縫整合。
但是,如果呼叫者在執行緒池執行緒上執行,則延續可能會在不同的執行緒池執行緒上執行。這是因為執行緒池執行緒並非專用於特定任務,而是可以同時用於多個操作。
要注意的是,可以使用ConfigureAwait 方法來修改await 運算子的行為。此方法可讓您指定延續是否應在同一執行緒或不同執行緒上執行。
例如,如果您不希望延續在同一執行緒上運行,而是在執行緒池執行緒上運行:
await task.ConfigureAwait(false);
透過了解同步上下文的工作原理,您可以有效管理非同步程式碼中的執行緒執行並防止潛在的鎖定問題。
以上是C# 中的「await」關鍵字後執行緒執行會發生什麼事?的詳細內容。更多資訊請關注PHP中文網其他相關文章!