我正在编写一个网络应用程序。
消息通过传输方式发送,如下所示:
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
}
我不喜欢跳过源代码来编写其中一部分和一部分的想法。很难理解和编辑。
我听说任务并行库大大简化了这个解决方案。
但是,我使用任务并行库阅读的许多示例都与启动一系列活动任务有关。我所说的“活动”的意思是,每个任务都可以在显式调用时启动,如下所示:
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
。如果我想从基于事件的异步模式(如上面的代码块)中创建一个任务,它会是什么样子?