2017-01-05 6 views
0

私はかなり複雑な設定をしており、解決方法をいくつか入力する必要があります。モデリング:依存関係を持つ並列キュー

Iタスク1,2A、2B、2C、3A、3B、3Cから成り、4

タスク1が並列にそれらのタスクの他に誰と最初に実行しなければならない。プロセスAを有します

タスク2a、2b、2cは順番に実行する必要がありますが、3a、3b、3cと並行して実行する必要があります(タスク4も3cと2cの後にのみ実行できます)。

私はこれをPriority Queueで最初に実装し、優先度と、2aと3aの意味を持つ種類のうちの1つのみを同時にデキューするメカニズムを使用して、同じ時刻、2bと3bなどをデキューできました。

しかし、3aが完了して3bを開始できる場合は、2aも完了するまで待たなければなりません。私の状況をいくらか処理できるキューメカニズムのアイデアが必要です。助けてください。

+0

TPL優勝のためのデータフロー。 https://www.google.co.uk/search?q=tpl+dataflow – spender

+0

これは非常に広い質問です。問題を絞り込んで、既存のコードを投稿することはできますか?これは簡単にこれに答えるのは難しいです。 – nozzleman

+0

各並列グループのタスクが実行された後でブロックする必要があります。 WaitHandlerを使用してブロックすることができます。 msdn:https://msdn.microsoft.com/en-us/library/58195swd(v=vs.110).aspxを参照してください。 – jdweng

答えて

0

あなたのソリューションは、(あなたがあなたの個々のタスクを実行し、そのタスクを返すメソッドRun...Asyncを持っていると仮定して)次のようになりasync Whithとawait:あなたはasync/awaitを使用しないようにしたい場合は

async Task RunTasks2Async() { 
    await RunTask2aAsync(); 
    await RunTask2bAsync(); 
    await RunTask2cAsync(); 
} 

async Task RunTasks3Async() { 
    await RunTask3aAsync(); 
    await RunTask3bAsync(); 
    await RunTask3cAsync(); 
} 

async Task RunAllTasks() 
{ 
    await RunTask1(); 
    Task task2 = RunTasks2Async(); 
    Task task3 = RunTasks3Async(); 
    await Task.WhenAll(task2, task3); 
    await RunTask4Async(); 
} 

、あなたはタスクのシリアル実行にはTask.ContinueWithを、並列実行にはTask.WhenAllを使用できます。

関連する問題