SynchronizationContext и Async / Await в WinForms - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужна помощь, чтобы понять, почему следуют тестовые блокировки? Я подозреваю, что это как-то связано с WindowsFormsSynchronizationContext, установленным как Текущий SyncronizationContext при создании элемента управления WinForm.


[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)

1 Ответ

0 голосов
/ 02 ноября 2019

Здесь больше контекста к ответу @ HansPassant:

Все это связано с Application.Run (), неизменно отсутствующим в модульном тесте. Это цикл диспетчера, реализованный Run (), который поддерживает выполнение асинхронного кода.

From https://blogs.msdn.microsoft.com/pfxteam/2012/01/20/await-synchronizationcontext-and-console-apps/

Ваш пользовательский интерфейс также имеет планировщик: сообщениенасос. Выделенный поток находится в цикле, отслеживая очередь сообщений и обрабатывая каждое из них;этот цикл обычно обрабатывает сообщения, такие как события мыши, события клавиатуры или события рисования, но во многих средах вы также можете явно передать его в работу, например, метод Control.BeginInvoke в Windows Forms или метод Dispatcher.BeginInvoke в WPF.

...