完了時に渡されたコールバック メソッドを呼び出す 2 つの非同期タスク (A & B) があります。両方が完了するまで待ち、タスク A と B の結果を使用して別のタスク C を実行できるようにしたいと考えています。
これはどのように達成できますか?これを行う標準的な方法はありますか?
どんな指針も役に立ちます。
完了時に渡されたコールバック メソッドを呼び出す 2 つの非同期タスク (A & B) があります。両方が完了するまで待ち、タスク A と B の結果を使用して別のタスク C を実行できるようにしたいと考えています。
これはどのように達成できますか?これを行う標準的な方法はありますか?
どんな指針も役に立ちます。
Task.WaitAllを使用して、タスクAとBが完了するのを待ちます。
例:
var A = new Task<string>(DoA);
var B = new Task<string>(DoB);
A.Start();
B.Start();
Task.WaitAll(A, B);
var C = new Task(() =>
{
string resultA = A.Result;
string resultB = B.Result;
//Do something more;
}
);
C.Start();
この問題を解決するには、たとえばスレッドを使用する方法がいくつかありますが、C#では、この他の方法を実装する手法があります。したがって、デリゲートと非同期メソッド呼び出しを使用する必要があります。
これはMicrosoftサポートからのリンクです-経験豊富なC#プログラマーであれば、下にスクロールしてサンプルを読むことができます。そうでない場合は、記事全体を読むことをお勧めします。
http://support.microsoft.com/kb/315582 (サンプル3で問題が解決する可能性があります)。
Task.WhenAllとTask.ContinueWithを使用する
var taskA = new Task<string>(DoA);
var taskB = new Task<string>(DoB);
var taskC = new Task<string>( () => DoC(taskA.Result, taskB.Result));
var taskCheckPoint = Task.WhenAll(taskA, taskB);
var taskFollowUp = taskCheckPoint.ContinueWith(taskC);
taskA.Start();
taskB.Start();
//now we return, instead of waiting.
.net 4.5 がない場合は、何らかの形式の Wait を使用する必要があります。Task 作成メソッドを待機させたくない場合は、代わりに taskC を待機させます。
var taskA = new Task<string>(DoA);
var taskB = new Task<string>(DoB);
var taskC = new Task<string>( () =>{
taskA.Wait();
taskB.Wait();
DoC(taskA.Result, taskB.Result)
});
taskA.Start();
taskB.Start();
taskC.Start();
//now we return, instead of waiting.