我正在编写联网应用程序。在基于事件的异步模式上使用任务并行库
消息通过传输发送,例如:
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());
我读过this article,但我不太明白。这似乎是我需要与TaskCompletionSource
有关。如果我想从基于事件的异步模式(如上面的代码块)中完成任务,它会是什么样子?
这是一个很棒的提示,让我更容易使用WebClient。谢谢!! –