2017-08-29 3 views
0

私は次のコードを持っている:TPL内部の作業

List<Task> tasks = new List<Task>(); 

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs1.Process(); 
}).ContinueWith((previousTask) => 
{ 
    rs5.Process(); 
    rs6.Process(); 
})); 

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs2.Process(); 
})); 

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs3.Process(); 
})); 

try 
{ 
    Task.WaitAll(tasks.ToArray()); 
} 
catch (AggregateException e) 
{ 
} 

rs1.Processが終了したときに()rs5.Process()とrs6.Processを()の同期を実行します。どのようにそれらを非同期で実行しますか?

私は、彼らが

+0

これらは「内部タスク」ではなく、継続です。タスクの実行を待ってください(async(previousTask)=> {Task.Run(()=> rs5.Process());待ちTask.Run(()=> rs6.Process())})); 「何か同じように。 – Fildor

+0

それはコンパイルされません – pantonis

+0

私はそれをテストしていない、おそらくそれをコンパイルするためにそれを変更する必要があります。アイデアを得るだけです。 – Fildor

答えて

0

を待たれていない内部の作業を使用している場合は、内側のタスクリストが必要です(TaskCreationOptions.AttachedToParent付き)

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs1.Process(); 
}).ContinueWith((previousTask) => 
{ 
    List<Task> loInnerTasks = new List<Task>(); 
    loInnerTasks.Add(Task.Run(() => rs5.Process())); 
    loInnerTasks.Add(Task.Run(() => rs6.Process())); 
    Task.WaitAll(loInnerTasks.ToArray()); 
})); 

UPDATE:

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs1.Process(); 
}).ContinueWith((previousTask) => 
{ 
    Task.Factory.StartNew(() => rs5.Process(), TaskCreationOptions.AttachedToParent); 
    Task.Factory.StartNew(() => rs6.Process(), TaskCreationOptions.AttachedToParent); 
})); 

例外もキャッチしなければなりません両方の方法で。

+1

親タスクに2つのinnersタスクを添付すれば、その方が良いと思います。https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/attached-and-detached-child-tasks – pantonis

+1

'TaskCreationOptions.AttachedToParent'を使用している場合、内部リストは必要ありません。しかし、内側のタスクを外側のリストに追加するのは意味がありません。 – PinBack

関連する問題