在多執行緒應用程式中,理解執行流程至關重要。當遇到神秘的「await」關鍵字時,開發人員經常會遇到這樣的問題:「哪個執行緒在「await」之後協調程式碼的恢復?」
考慮以下程式碼片段:
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
假設這段程式碼在單執行緒應用程式中運行,它會變得令人困惑:如果執行緒是,'await'關鍵字後面的程式碼如何執行被「task.Wait()」鎖定?
答案在於「await」關鍵字的複雜行為。它將控制權交還給呼叫者,允許其他非同步操作繼續進行。 「等待」任務的延續(「等待」之後的程式碼)被安排在符合目前同步上下文的執行緒上執行。
在這種情況下,如果「MyMethod()」函數在 UI 執行緒上執行,「await」之後的程式碼也會在 UI 執行緒上執行一次「MyOtherAsyncMethod()」完成。
但是,需要注意的是,不能保證用於延續的確切執行緒。在多執行緒應用程式中,延續可以在執行緒池中的任何可用執行緒上執行。但是,同步上下文確保“await”之後的程式碼以與原始執行緒一致的方式執行。
在給定的範例中,透過呼叫“task.Wait()”,主執行緒執行緒將無限期地被阻塞,從而阻止繼續執行。為了避免這種情況,應該正確等待非同步操作而不阻塞主執行緒。
以上是在多執行緒應用程式中,什麼執行緒在「await」關鍵字之後執行程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!