私はネットワーク化されたアプリケーションを書いています。
メッセージは、次のようにトランスポートを介して送信されます。
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() );
この記事を読みましたが、よくわかりません。私が必要としているのはと関係があるようですTaskCompletionSource
。上記のコードブロックのようなイベントベースの非同期パターンからタスクを作成したい場合、どのようになりますか?