0

完了時に渡されたコールバック メソッドを呼び出す 2 つの非同期タスク (A & B) があります。両方が完了するまで待ち、タスク A と B の結果を使用して別のタスク C を実行できるようにしたいと考えています。

これはどのように達成できますか?これを行う標準的な方法はありますか?

どんな指針も役に立ちます。

4

3 に答える 3

2

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();
于 2012-08-08T08:44:27.403 に答える
1

この問題を解決するには、たとえばスレッドを使用する方法がいくつかありますが、C#では、この他の方法を実装する手法があります。したがって、デリゲートと非同期メソッド呼び出しを使用する必要があります。

これはMicrosoftサポートからのリンクです-経験豊富なC#プログラマーであれば、下にスクロールしてサンプルを読むことができます。そうでない場合は、記事全体を読むことをお勧めします。

http://support.microsoft.com/kb/315582 (サンプル3で問題が解決する可能性があります)。

于 2012-08-08T08:42:16.937 に答える
1

Task.WhenAllTask.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.
于 2012-08-17T17:56:02.137 に答える