为什么这个异步调用不完整?

时间:2014-12-17 12:52:50

标签: c# winforms async-await deadlock

为什么以下代码不起作用(意味着它永远不会到达MessageBox,说它已完成)?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    async Task SomeTask1()
    {
        await Task.Run(async () => await SomeTask2());
    }

    async Task SomeTask2()
    {
       var tb = new Button();          
       await Task.Delay(100);            
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        await SomeTask1();
        MessageBox.Show("Done!");
    }
}

这是来自真实系统中的实际代码的非常简化的repro代码。我知道我可以通过

来解决这个问题
  • 从SomeTask1中删除Task.Run并直接等待SomeTask2,或
  • 从SomeTask2或
  • 中删除“var tb = new Button()”行
  • 在SomeTask2
  • 中调用“var tb = new Button()”行

但是,我感兴趣为什么这不起作用,而不是如何解决它。是因为“new Button()”行会弄乱同步上下文吗?

0 个答案:

没有答案