-1

这是我的最小复制案例:

public Form1()
{
    Task.Delay(100).Wait();  // Works just fine

    this.Await().Wait();     // Blocks indefinitely
}

private async Task Await()
{
    await Task.Delay(100);
}

这里发生了什么?为什么这两个行为不同?我该怎么做才能使后一个工作?

我的实际情况不那么简单,我不能“只使用第一个选项”。

4

1 回答 1

5

您会看到我在博客MSDN 文章中描述的典型死锁情况。简而言之,await完成后,该async方法会尝试在 UI 线程上恢复,您已通过调用Wait.

要修复它,您最好一直使用async(即永远不要阻塞async代码)。构造函数在这里造成了困难(因为它们不能async);我在我的博客上探索了几个选项。正确的选项取决于您的代码库,但async如果可能,我推荐使用工厂方法。选项包括:

  • 异步工厂方法。
  • 异步延迟初始化。
  • 异步初始化模式。

如果您绝对不能使用我在博客中描述的选项之一,那么您可以通过ConfigureAwait(false)在所有async方法中使用来解决此问题,这样您Wait()就不会死锁。但是,这在那些异步方法调用期间阻塞 UI 线程(这有点违背了它们async最初的目的......)

于 2013-08-07T15:52:05.893 回答