[英]Async method await keyword doesn't suspend to calling method
我有以下代碼行,以了解async-await
和暫停直到等待完成的任務。
public async Task<string> WaitAsynchronouslyAsync()
{
var results = await WaitAsync();
Console.WriteLine($@"I am not waiting");
return results;
}
public async Task<string> WaitAsync()
{
await Task.Delay(10000).ConfigureAwait(false);
return "Async programming suspension point demo.";
}
await
操作符將暫停執行,直到WaitAsync()
(延遲10秒)方法的工作完成為止。
在此期間,我期待的是Console.WriteLine($@"I am not waiting");
應該將文本寫入輸出窗口,直到等待的任務完成為止,因為控制權已返回給WaitAsync()
的調用方。 任務完成執行后,await表達式將計算字符串( "Async programming suspension point demo."
)。
我在這里將懸浮指針與調試指針混淆了嗎?
等待操作符將暫停執行,直到WaitAsync()方法的工作完成為止。
正確。
我期待的是Console.WriteLine($ @“我不在等待”); 應該將文本寫入輸出窗口,直到等待的任務完成為止,因為控制權已返回給WaitAsync()的調用方。
為什么? 您只是說過await運算符會暫停執行直到工作完成 。 再過十秒鍾,這項工作將無法完成; 工作是等待十秒鍾 。 直到執行return
, WaitAsync
的工作 WaitAsync
完成,並且在將來。
正確的做法是,讓WaitAsynchronouslyAsync
允許其調用方在這種情況下運行。
您已經正確說明了await
的含義,但是您似乎沒有完全將后果內在化。 await
檢查其操作數以查看任務是否完成。 如果是,則獲取任務的結果,該方法繼續。 如果不是,則將該方法的其余部分簽署為該任務的繼續,並產生控制權,以便可以在其他地方完成更多工作。 將來,當任務完成時,將計划執行該方法的其余部分。
await
表示“等待,直到異步完成執行”,直到提供的Task
完成執行后,您的功能才會繼續。
如果您改為說以下內容,將不會等待:
var results = WaitAsync();
Console.WriteLine($@"I am not waiting");
return await results;
或更簡潔地說,從簽名中刪除async
,然后就可以return results;
。
操作順序如下:
WaitAsynchronouslyAsync
WaitAsynchronouslyAsync
調用WaitAsync
WaitAsync
調用Task.Delay(10000).ConfigureAwait(false)
,從而產生Task
。 WaitAsync
將新的Task
返回給其調用方WaitAsynchronouslyAsync
,稍后將完成 WaitAsynchronouslyAsync
等待從任務WaitAsync
,然后返回到它的調用者,提供了一個Task
代表將於何時完成。 Task.Delay
完成后,將觸發WaitAsync
的延續,並從中斷處繼續。 WaitAsync
返回字符串,完成Task
。 WaitAsync
返回的Task
已完成,因此WaitAsynchronouslyAsync
現在可以繼續。 它將繼續向控制台輸出文本。 WaitAsynchronouslyAsync
完成它的任務,讓任何設置了任何東西的人都可以在它完成時運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.