順番に(各フローで)処理する必要のある複数のフローに依存するタスクをキューしたい。フローは並行して処理できます。スレッドプールによって処理される依存タスクをキューに入れるC#
具体的には、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を使用しないでくださいされて/ .NET 4.0?今私は2つのワーカースレッド、1つのキューに1つがあり、私は各キューに対してBlockingCollection<>
を使用します。代わりに、.NETスレッドプールを活用して、ワーカースレッドが(フロー間で)アイテムを同時に処理するようにしたいが、フロー内では連続して処理する。言い換えれば、例えばwi1bがwi1aの完了に依存し、wi1bが到着したときにwi1aを完了して覚えておく必要がないことを示すことができます。言い換えれば、私は、「私はすでにキュー1のために提出した他のアイテムと連続的に処理されるが、他のキューに提出された作業アイテムと並行して処理されるべきである。
この説明が意味をなされることを望みます。コメントがない場合は、コメントで質問してください。私はこの質問を適宜更新します。
読んでいただきありがとうございます。
アップデート:ここで、これまでの「欠陥」ソリューションを要約する
は、私が使用することはできません解答セクションと、私はそれらを使用できない理由(複数可)からの解決策は以下のとおりです。
TPLタスクでは、ContinueWith()
の先行タスクを指定する必要があります。私は、新しいタスクを提出するときに、各キューの先行タスクに関する知識を維持したくありません。
TDF ActionBlocksは有望ですが、ActionBlockに投稿されたアイテムは並行して処理されるようです。私は、特定のキューの項目を順次処理する必要があります。
アップデート2:
RE:ActionBlocks
1つにMaxDegreeOfParallelism
オプションを設定すると、単一のActionBlock
に提出された作業項目の並列処理を妨げるように思われます。したがって、待ち行列ごとにActionBlock
を持つことで、MicrosoftからTDFライブラリをインストールして展開する必要があり、純粋な.NET 4.0ソリューションを望んでいたという唯一の欠点が私の問題を解決しているようです。これまでのところ、これは受験者が受け入れ可能な答えです。誰かが、キューごとにワーカースレッドに縮退しない純粋な.NET 4.0ソリューション(これは私がすでに使用しています)でこれを行う方法を理解できない限りです。
Task/ContinueWithを見ましたか? –
私は、ContinueWithが前のタスクの知識を必要としていることに気付きました。元の質問に指定されている先行タスクを追跡する必要はありません。その理由の1つは、キューごとに行う必要があるためです。代わりに、私は提出の時点から "発砲と忘却"し、タスク処理述語のエラーとエラーの伝播を処理したいと考えています。言い換えれば、私は提出時点で最小限の状態、つまり作業項目とそれを送信すべき待ち行列を望みます。 –