私はネットワークアプリケーションを作成しています。イベントベースの非同期パターンでのタスク並列ライブラリの使用
メッセージは、次のようなトランスポートを介して送信されます。
Network.SendMessage (new FirstMessage());
私はそうのように、このメッセージタイプが到着したときに呼び出されるイベントハンドラを登録することができます。
Network.RegisterMessageHandler<FirstMessage> (OnFirstMessageReceived);
そして、イベントが発生します:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
}
私はネットワークアプリケーションのカスタム認証手順を書いていますが、完了するために約5つのメッセージが必要です。
タスク並列ライブラリを使用しない、私はそうのように、先行するイベントハンドラで、各手順の次のステップをコード化することを余儀なくされるだろう:
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での作業がはるかに簡単でした。ありがとう!! –