WinForms中的SynchronizationContext和Async/Await

WinForms中的SynchronizationContext和Async/Await,winforms,async-await,Winforms,Async Await,我需要帮助理解为什么会出现以下测试死锁?我怀疑这与WinForm控件创建期间设置为当前的SyncronizationContext的WindowsFormsSynchronizationContext有关 [TestMethod] public async Task myTest() { //During this winForms control creation, WindowsFormsSynchronizationContext is set as Current Sy

我需要帮助理解为什么会出现以下测试死锁?我怀疑这与WinForm控件创建期间设置为当前的
SyncronizationContext
WindowsFormsSynchronizationContext
有关


[TestMethod]
public async Task myTest()
  {
      //During this winForms control creation, WindowsFormsSynchronizationContext is set as Current SyncronizationContext
      new SomeWinformControl();

      //This statement deadlocks
      await Task.Run(() => { });
  }

(MSTest使用.NET 4.5.2)

以下是@HansPassant答案的更多上下文:


它与Application.Run()有关,总是在 单元测试。它是由Run()实现的调度程序循环 这使异步代码保持运行

您的用户界面也有一个调度程序:消息泵。A. 专用线程位于一个循环中,监视消息队列和 处理每一项;该循环通常像鼠标一样处理消息 事件、键盘事件或绘制事件,但在许多框架中 也可以显式地将工作交给它来完成,例如控件。BeginInvoke 方法,或WPF中的Dispatcher.BeginInvoke方法


它与Application.Run()有关,而Application.Run()总是在单元测试中丢失。是由Run()实现的dispatcher循环使异步代码继续运行。@HansPassant,如果您创建一个答案,我会将其标记为已接受。