0

BlockingCollectionnew of で実装された「単一のプロデューサー/単一の消費者」シナリオがあり.NET 4.0ます。

問題は、コレクション内に 1 つのスペースが空くとすぐにプロデューサー スレッドが起動することです。コンシューマがコレクション アイテムの少なくとも半分を消費するまで、プロデューサがブロックするようにします。これは、プロデューサの速度が速く、プロデュースがシステムにとってコストがかかるためです。

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

4

1 に答える 1

3

考慮すべきアプローチは、多数の「小さい」単一アイテムではなく、少数の「より大きな」アイテムをキューに入れることです。

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

消費者が 100 個のアイテムのリストを取得すると、実際には未処理のアイテムの可能な合計数の半分、つまり 200 個のアイテムが取得されます。したがって、概念的には、これによりブロック状態が得られます。

于 2011-01-27T08:45:21.430 に答える