[英]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服務沒有合適的上下文,
AsyncContext
或AsyncContextThread
可以在這些情況下使用。“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.