Использование параллельной библиотеки задач на асинхронном рисунке на основе событий

Я пишу сетевое приложение.

Сообщения отправляются по транспортировке как таковые:

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 . Если бы я хотел сделать задачу из моего асинхронизации на основе мероприятий, как код код выше, как бы он выглядел?

12
задан Jason 8 September 2011 в 01:38
поделиться