(各フローで)順番に処理する必要がある複数のフローにまたがる依存タスクをキューに入れたい。フローは並行して処理できます。
具体的には、2つのキューが必要であり、各キューのタスクを順番に処理したいとします。望ましい動作を説明するためのサンプル擬似コードを次に示します。
Queue1_WorkItem wi1a=...;
enqueue wi1a;
... time passes ...
Queue1_WorkItem wi1b=...;
enqueue wi1b; // This must be processed after processing of item wi1a is complete
... time passes ...
Queue2_WorkItem wi2a=...;
enqueue wi2a; // This can be processed concurrently with the wi1a/wi1b
... time passes ...
Queue1_WorkItem wi1c=...;
enqueue wi1c; // This must be processed after processing of item wi1b is complete
これは、作業項目間の依存関係を示す矢印の付いた図です。
問題は、C#4.0 /.NET4.0を使用してこれをどのように行うかです。現在、キューごとに1つずつ、合計2つのワーカースレッドがあり、キューBlockingCollection<>
ごとにを使用しています。代わりに、.NETスレッドプールを活用して、ワーカースレッドにアイテムを同時に(フロー全体で)処理させたいのですが、フロー内でシリアルに処理させたいと思います。言い換えると、たとえば、wi1bが到着したときに、完了を追跡してwi1aを覚えておく必要なしに、wi1bがwi1aの完了に依存していることを示したいと思います。つまり、「queue1の作業項目を送信したいのですが、これは、すでにqueue1に送信した他の項目と連続して処理されますが、他のキューに送信された作業項目と並行して処理される可能性があります」。
この説明が理にかなっていることを願っています。そうでない場合は、コメントで質問してください。それに応じてこの質問を更新します。
読んでくれてありがとう。
アップデート:
これまでの「欠陥のある」解決策を要約すると、私が使用できない回答セクションの解決策と、それらを使用できない理由は次のとおりです。
TPLタスクでは、の先行タスクを指定する必要がありますContinueWith()
。新しいタスクを送信するときに、各キューの先行タスクの知識を維持したくありません。
TDF ActionBlocksは有望に見えましたが、ActionBlockに投稿されたアイテムは並行して処理されているように見えます。特定のキューのアイテムをシリアルに処理する必要があります。
アップデート2:
RE:ActionBlocks
オプションを1に設定するMaxDegreeOfParallelism
と、単一に送信された作業項目の並列処理が妨げられるように見えますActionBlock
。したがって、ActionBlock
キューごとに問題を解決できるようですが、唯一の欠点は、MicrosoftからのTDFライブラリのインストールと展開が必要であり、純粋な.NET4.0ソリューションを望んでいたことです。これまでのところ、これは候補として受け入れられた答えです。ただし、キューごとにワーカースレッドに縮退しない純粋な.NET 4.0ソリューション(私がすでに使用している)でこれを行う方法を誰かが理解できない限りです。