Это происходит потому, что WindowsFormsSynchronizationContext
зависит от существования стандартного цикла сообщений Windows. Консольное приложение не запускает такой цикл, поэтому сообщения, отправленные на WindowsFormsSynchronizationContext
, не обрабатываются, продолжения задачи не вызываются, и поэтому программа зависает на первом await
. Вы можете подтвердить отсутствие цикла сообщений, запросив логическое свойство Application.MessageLoop
.
Получает значение, указывающее, существует ли цикл сообщений в этом потоке.
Чтобы сделать WindowsFormsSynchronizationContext
функциональным, вы должны запустить цикл обработки сообщений. Это можно сделать так:
static void Main(string[] args)
{
EventHandler idleHandler = null;
idleHandler = async (sender, e) =>
{
Application.Idle -= idleHandler;
await MyMain(args);
Application.ExitThread();
};
Application.Idle += idleHandler;
Application.Run();
}
Метод MyMain
- это ваш текущий метод Main
, переименованный.
Обновление: На самом делеМетод Application.Run
автоматически устанавливает WindowsFormsSynchronizationContext
в текущем потоке, поэтому вам не нужно делать это явно. Если вы хотите запретить эту автоматическую установку, настройте свойство WindowsFormsSynchronizationContext.AutoInstall
перед вызовом Application.Run
.
Свойство AutoInstall
определяет, является ли WindowsFormsSynchronizationContext
устанавливается при создании элемента управления или при запуске цикла сообщений.