簡體   English   中英

Task.WaitAll掛起async / await任務

[英]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無法長時間運行。 奇怪的是,這不會在工作人員角色開始后立即發生 - 可能需要幾天或幾周的正常操作才能掛起。

我可能會過多地簡化代碼 - 也許在SomeIoOperationSomeIoOperation發生了什么很重要 - 但我覺得這與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM