簡體   English   中英

無法在異步等待中復制死鎖

[英]cannot replicate deadlock on async await

我希望在下面的代碼上發生死鎖:

static async Task<int> DelayAndReturnAsync(int val)
{
    await Task.Delay(TimeSpan.FromSeconds(val));
    return val;
}

static async Task<int> ProcessTaskAsync()
{
    var taskA = await DelayAndReturnAsync(3);
    int num = taskA++;
    return num;
}

static void Main(string[] arg)
{
    var testTask = ProcessTaskAsync();
    testTask.Wait();
    Console.WriteLine("Done");
}

由於主線程(當前上下文)在調用ProcessTaskAsync()並在teskTask.Wait()上被阻塞后等待,當DelayAndReturnAsync()完成時,它無法返回到該方法並繼續其余代碼。主線程將等待ProcessTaskAsync完成,而ProcessTaskAsync正在等待它(原始上下文)繼續其余的代碼。 因此陷入僵局。

如果我的理解有任何問題,請告訴我。 我最初試圖復制死鎖並測試在ProcessTaskAsync上使用ConfigureAwait(false)方法的解決方案。 例如ProcessTaslAsync.ConfigureAwait(false)

該死鎖只能在存在SynchronizationContext發生,而SynchronizationContext在控制台應用程序中默認不存在。 因為沒有SynchronizationContext開始,就像每個await隱式添加ConfigureAwait(false)

您可以在UI或asp.net應用程序中嘗試它,或者甚至更好地使用Stephen Cleary的AsyncContext為您的測試添加SynchronizationContext

AsyncContext類型提供了執行異步操作的上下文AsyncContext關鍵字需要返回一個上下文;對於大多數程序,這是一個UI上下文,你不必擔心它.ASP.NET還提供了一個適當的背景,你不必使用自己的。

但是,控制台應用程序和Win32服務沒有合適的上下文, AsyncContextAsyncContextThread可以在這些情況下使用。“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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