2011-12-15 5 views
4

私は検索しましたがどこからでも明示的な確認を見つけることはできません...タスクに複数の継続(連鎖継続ではありません)がある場合、それらの継続は互いに並行して実行されますか?タスクの継続はお互いに非同期で実行されますか?

私はtask1を実行し、次にtask2-task3-task4を互いに並列に実行したい、そして最後にtask5をすべて終了した後に実行したい。以下の例。タスク2と3と4は確実に非同期で実行されますか?

パターンを改善するための提案はすべて歓迎します。この構成を達成するにはいくつかの異なる方法があるようです。ありがとう

public Task MyWorkflowAsync() { 
    Task task1 = Task.Factory.StartNew(() => DoTask1()); 

    var tarray = new Task[] { 
    task1.ContinueWith(task => DoTask2()), 
    task1.ContinueWith(task => DoTask3()), 
    task1.ContinueWith(task => DoTask4()) 
    }; 

    return Task.Factory.ContinueWhenAll(tarray, completedTasks => DoTask5()); 
} 

答えて

3

いいえ、継続はデフォルトスケジューラによってLIFOの順序で実行されます。すべてを並行して実行したい場合は、これを行う必要があります。

public Task MyWorkflowAsync() 
{ 
    var tasks = new List<Task>(); 
    var task1 = Task.Factory.StartNew(DoTask1); 

    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask2)))); 
    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask3)))); 
    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask4)))); 

    return Task.Factory.ContinueWhenAll(tasks.ToArray(), completedTasks => DoTask5()); 
} 
+0

ヤック私が望んでいた答えではありません:-)なぜ内部DoTasksを追加する必要があるのか​​分かりますが、なぜ外部ContinueWithタスクを追加する必要がありますか?あなたの例では、タスクは3つではなく6つのメンバーで終了しますが、それは正しいのですか? – nmarler

+0

私はそれにヌードルしているので、あなたは外に追加する必要はありません。試してみる。 –

+0

私はあなたの助言に従い、試してみました。私の元の投稿のパターンが私に必要なものを私に与えるように見えます。私は、ランダムスリープ時間を持つDoTaskメソッドと、そのManagedThreadIDを含むmsec精度のタイムスタンプを埋めました。 DoTask2-4はいつも互いに数ミリ秒以内に、ランダムな順序で、別々のスレッド上で開始します。 DoTasksは、睡眠時間の順に終了します。実行時間の合計は2-4の最長時間と1と5のオーバーヘッドがあります。また、5は常に2-4の最長実行と同じスレッドで実行されます。 – nmarler

関連する問題