[英]Task.WaitAll hangs with async/await tasks
我必須遺漏一些明顯的東西,比如SynchronizationContext
上的死鎖,但我不明白它為什么會發生,並且不明白我怎么能避免它......
所以,該應用程序是Azure WorkerRole(基本上,據我所知,通常的Windows應用程序沒有UI)。 在應用程序中,我試圖並行執行許多任務,我的代碼的原理圖版本如下:
private async Task DoJob()
{
await SomeIoOperation();
}
public void MethodExecutedByWorkerRoleInAnInfiniteLoop()
{
Log("Start");
Task.WaitAll(DoJob(), DoJob(), DoJob());
Log("End");
}
我的想法是我們在這里運行默認的SynchronizationContext
,所以我們應該避免在類似情況下遇到的死鎖,例如ASP.NET。
但是, 有時執行掛起 - 記錄開始,直到我重新啟動輔助角色,結束不是幾天。 當然,DoJob無法長時間運行。 奇怪的是,這不會在工作人員角色開始后立即發生 - 可能需要幾天或幾周的正常操作才能掛起。
我可能會過多地簡化代碼 - 也許在SomeIoOperation
中SomeIoOperation
發生了什么很重要 - 但我覺得這與SynchronizationContext
誤用有明顯關系。
SomeIoOperation.ConfigureAwait(false)
幫助嗎? 我甚至無法測試它,因為我不知道它是否正常工作,因為問題已得到修復,或者最終會在幾天之后停止。
想法?
你完全陷入SynchronizationContext的死鎖。 只需使用WhenAll
而不是WaitAll
:
public async Task MethodExecutedByWorkerRoleInAnInfiniteLoop()
{
Log("Start");
await Task.WhenAll(DoJob(), DoJob(), DoJob());
Log("End");
}
一切都會奏效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.