我正在編寫聯網應用程序。在基於事件的異步模式上使用任務並行庫
消息通過傳輸發送,例如:
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。謝謝!! –