【发布时间】:2019-11-24 09:00:28
【问题描述】:
我准备了 WinForms 应用程序来测试单行异步方法是否会导致死锁。 button1_Click 事件等待由单行异步代理方法等待的GetZero 任务。但是,它会导致死锁。为什么?我读过await 完成后,单行异步方法不需要继续执行任何操作,因此没有委托发布到消息泵导致死锁。
作为参考,button2_Click 事件在没有代理调用者的情况下等待任务GetZero 的结果,并且应用程序工作正常。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var zero = ProxyCallery().Result;
label1.Text += $"{zero}";
}
private void button2_Click(object sender, EventArgs e)
{
var zero = GetZero().Result;
label1.Text += $"{zero}";
}
private async Task<int> ProxyCallery()
{
return await GetZero();
}
private async Task<int> GetZero()
{
await Task.Delay(100).ConfigureAwait(false);
return await Task.FromResult(0);
}
}
为什么button1_Click会导致死锁?
【问题讨论】:
-
尝试在
ProxyCallery中的 await 表达式上调用ConfigureAwait(false)。我依稀记得ConfigureAwaits 必须沿着调用链保持一致。 -
Don't Block on Async Code。见
Preventing the Deadlock部分。
标签: c# winforms deadlock synchronizationcontext