2011-01-27 4 views
0

BlockingCollection.NET 4.0で実装されている「シングルプロデューサ/シングルコンシューマ」シナリオがあります。コレクションがSystem.Collections.Concurrent.BlockingCollectionを使用して容量の半分に達するまでプロデューサをブロックします

問題は、プロデューサスレッドが、コレクション内に1つの空きスペースが空いているとすぐに目を覚ますことです。私は消費者がコレクションアイテムの少なくとも半分を消費するまで、プロデューサーをブロックしたい。これは、プロデューサの速度が速く、生産がシステムにとって高価であるためです。

プロデューサのブロック条件を制御するにはどうすればよいですか?

答えて

3

「小さな」単一項目が多数ではなく、「大きな」項目が少なくなることを考慮するアプローチが考えられます。

たとえば、バインドされたコレクションを1に変更し、アイテムタイプをアイテムのリストに変更することができます。このようにして、プロデューサーは100アイテムのリストを作成してキューに入れることができ、消費者はこのリストを取得して処理し、プロデューサーは次の100アイテムから開始します。ここで重要な点は、消費者が終了するのを待つことをブロックする前に、1つのバッチで大量のバッチデータを生成するようにプロデューサを最適化することです。コレクションにはあまりスラッシングはありませんが、生産と消費は重複しています。

消費者が100個のアイテムのリストを取るとき、それは有効なアイテム、すなわち200個のアイテムの総数の半分を占める。概念的には、これはあなたにブロッキング条件を与えます。

+0

なぜ「BoundedCapacity」があるのですか?彼らはフレームワークで2とハードコードすることができます。このアイデアは機能しますが、これは問題をシフトさせており、そのようなコードは維持するのが難しいです(リストサイズの変更を考慮してください) – Xaqron

+0

@Xaqron Boundingは全体的なスロットリングに役立ち、またメモリの問題を引き起こす速い生産を防ぎます。状況。リストセマンティクスをアプリケーションに適合させるのがどれほど難しいかについて私はコメントすることはできませんが、全体的なテクニックとしてはあまり問題にはならないと感じています。キューに入れる前に結果を収集し、デキュー時に結果を列挙するだけです。私は生産と消費がバランスのとれていないので、データの半分で必ずしも正確に均衡するとは限りません。 –

関連する問題