Я пишу сетевое приложение.
Сообщения отправляются по транспортировке как таковые:
Network.SendMessage (new FirstMessage() );
Я могу зарегистрировать обработчик событий, который будет вызван, когда приходит этот тип сообщения, например, так:
Network.RegisterMessageHandler (OnFirstMessageReceived);
и событие уволено:
public void OnFirstMessageReceived(EventArgs e)
{
}
Я пишу Пользовательская процедура аутентификации для моего сетевого приложения, которое требует около пяти сообщений для завершения.
без использования параллельной библиотеки задачи, я был бы вынужден кодировать следующий шаг каждой процедуры в предыдущем обработчике событий, вроде так:
public void OnFirstMessageReceived(EventArgs e)
{
Network.SendMessage( new SecondMessage() );
}
public void OnSecondMessageReceived(EventArgs e)
{
Network.SendMessage( new ThirdMessage() );
}
public void OnThirdMessageReceived(EventArgs e)
{
Network.SendMessage( new FourthMessage() );
}
public void OnFourthMessageReceived(EventArgs 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
. Если бы я хотел сделать задачу из моего асинхронизации на основе мероприятий, как код код выше, как бы он выглядел?