Как новая функция async/await в C# 5 интегрируется с циклом сообщений?

У меня не было возможности проверить CTP новой функции C# async/await, но вот что мне было интересно:

Как это интегрируется с циклом сообщений? Я предполагаю, что в стандартном приложении Windows (Winforms, WPF) продолжения вызываются путем отправки сообщений в цикл обработки сообщений приложения с использованием Dispatcher или аналогичного?

Что если я не использую стандартный цикл сообщений Windows? Например, в приложении GTK# или в консольном приложении (если эта функция вообще может быть полезна в консольном приложении).

Я искал в интернете информацию об этом, но безрезультатно. Кто-нибудь может объяснить?

2 ответа

Решение

Он использует System.Threading.SynchronizationContext.Current. И WPF, и Winforms устанавливают свою собственную версию SynchronizationContext. Которые используют свой цикл сообщений для перенаправления вызова из рабочего потока обратно в основной поток пользовательского интерфейса. Соответственно с Dispatcher.Begin/Invoke и Control.Begin/Invoke().

Выполнить это в приложении в режиме консоли нелегко, его основной поток не имеет четко определенного состояния "бездействия", которое позволило бы вводить вызовы маршалированных методов безопасным способом, избегая головной боли при повторном входе. Вы, конечно, можете добавить его, но при этом вы будете заново изобретать цикл сообщений.

Все сводится к тому, что "ожидающий" делает с продолжением, которое он прошел.

Реализация для Task<T> в BCL будет использовать текущий контекст синхронизации ( если вы не попросите его не использоватьConfigureAwait) - это означает, что в WPF/SilverLight будет использоваться диспетчер; в Windows Forms будет использоваться что-то вроде Control.BeginInvokeи в потоке пула потоков он просто будет работать в любом потоке пула потоков. Обратите внимание, что это ваш текущий контекст в точке выражения await, что важно, так как это то, что задача захватит для продолжения продолжения.

Связанный пост в блоге (автор Mads Torgersen) отлично объясняет, как все это работает, и у меня есть серия постов в блоге, которые вы также можете найти полезными.

Другие вопросы по тегам