Я недавно поигрался с новой Async CTP, и я столкнулся с ситуацией, когда я не уверен, как действовать.
В моей текущей кодовой базе я используюпонятие «рабочие места» и «менеджер по работе».Задания существуют исключительно с целью обработки исходного сообщения, отправки ответа и его ожидания.
У меня уже есть существующий код, основанный на синхронных сокетах, где сетевой поток ожидает поступления данных, изатем передать его обработчику событий и, в конечном итоге, менеджеру работ.
Менеджер работ ищет, какое задание обработает сообщение, и передает его.
Таким образом, сценарий таков:
- Менеджер заданий получает новое сообщение и запускает задание.
- Задание запускается, обрабатывает сообщение и отправляет ответное сообщение.
- На этом этапезадание будет ожидать ответа на ответ.
Вот пример псевдокода:
class MyJob : Job
{
public override void RunJob( IPacketMsg packet )
{
// handle packet
var myReply = new Packet();
SendReply( myReply );
await GetResponse();
}
}
Но я не совсем уверен, как действовать на шаге 3. ЗаданиеМенеджер получит ответ, а затем передаст его выполненной работе.Но я не уверен, как заставить работу ждать ответа.
Я подумал о создании ожидаемой Задачи, которая просто блокирует WaitHandle, но это лучшее решение?
Могу ли я сделать что-нибудь еще в этом случае?
Редактировать Что касается Async CTP, что происходит в ситуации, когда пользовательский интерфейс не используется.Я перечитал блог Эрика Липперта об Async, но я не думаю, что он когда-либо затрагивал тему того, как все работает в фоновом режиме без потока пользовательского интерфейса (это работает в фоновом режиме или ...?)