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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 13 октября 2011

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

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

4 голосов
/ 13 октября 2011

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

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

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

...