Я пишу сетевое приложение.
Сообщения отправляются по транспорту как таковые:
Network.SendMessage (new FirstMessage() );
Я могу зарегистрировать обработчик события, который будет вызываться при получении этого типа сообщения, например:
Network.RegisterMessageHandler<FirstMessage> (OnFirstMessageReceived);
И событие запускается:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
}
Я пишу пользовательскую процедуру аутентификации для моего сетевого приложения, которая требует около пяти сообщений.
Без использования библиотеки параллельных задач я был бы вынужден закодировать следующий шаг каждой процедуры в предыдущем обработчике событий, например:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
Network.SendMessage( new SecondMessage() );
}
public void OnSecondMessageReceived(EventArgs<SecondMessageEventArgs> e)
{
Network.SendMessage( new ThirdMessage() );
}
public void OnThirdMessageReceived(EventArgs<ThirdMessageEventArgs> e)
{
Network.SendMessage( new FourthMessage() );
}
public void OnFourthMessageReceived(EventArgs<FourthMessageEventArgs> e)
{
// Authentication is complete
}
Мне не нравится идея прыгать по исходному коду, чтобы кодировать часть этого и часть этого. Это трудно понять и отредактировать.
Я слышал, что библиотека параллельных задач существенно упрощает это решение.
Однако многие из примеров, которые я прочитал с помощью библиотеки параллельных задач, были связаны с запуском цепочки активных задач. Под active я подразумеваю, что каждая задача может запускаться при явном вызове, например, так:
public void Drink() {}
public void Eat() {}
public void Sleep() {}
Task.Factory.StartNew( () => Drink() )
.ContinueWith( () => Eat() )
.ContinueWith( () => Sleep() );
Это противоположно моему асинхронному шаблону на основе событий, в котором каждый метод обработчика событий вызывается только при получении сообщения.
Другими словами, я не могу сделать что-то подобное (, но я хочу ):
Task.Factory.StartNew( () => OnFirstMessageReceived() )
.ContinueWith( () => OnSecondMessageReceived() )
.ContinueWith( () => OnThirdMessageReceived() )
.ContinueWith( () => OnFourthMessageReceived() );
Я прочитал эту статью , но я не совсем понимаю. Похоже, что мне нужно сделать с TaskCompletionSource
. Если бы я хотел создать задачу из моего асинхронного шаблона, основанного на событиях, как приведенный выше блок кода, как бы он выглядел?