1

ディクショナリへの複数の入力 (ディクショナリへの複数のスレッドの書き込み) と、このディクショナリを取得し、ISender を使用してそれを送信し、新しい大量のデータのディクショナリをクリアする 1 つの時間指定されたコンシューマーを持つことができるモジュールを実装する必要があります。問題は、生成スレッドが新しいクリアされた辞書に書き込みを続けられるようにしながら、消費スレッドがバルクの最速のスナップショットを取得するようにインターロックを設計する必要があることです。インターロックと ConcurrentDictionary を使用して提案する消費者向けプロデューサーの最適な設計は何ですか?

よろしくお願いします!

4

2 に答える 2

1

プロデューサー スレッドがデータをディクショナリに直接入れないようにしてください。などのスレッドセーフなキューに入れてもらいますBlockingCollection。コンシューマ スレッドはキューからアイテムを取得し、ディクショナリを作成して送信することができます。すべてプロデューサー スレッドをブロックする必要はありません。

基本的に同じ作業が行われますが、ほとんどのブロッキングを回避する方法で「分散」されます。

その単一のキューでの競合が特に心配な場合は、BlockingCollectionプロデューサースレッドごとに個別に作成BlockingCollection.TakeFromAnyしてから、コンシューマーで使用することもできます。


もちろん、問題は、コンシューマー スレッドが単に辞書に書き込む以外のことを行う場合です。たとえば、指定されたキーが辞書に既に存在するかどうかを確認する必要がある場合、この設計は突然はるかに複雑になります。

于 2011-10-11T00:03:54.907 に答える
1

私が考えることができる最速の方法は、複数の辞書オブジェクトを使用することです。

コンシューマ スレッドが実行ConcurrentDictionaryされると、新しい辞書が作成され、「ライブ」辞書として設定されます。これは高速であり、生産者は最小限の中断で続行できることを意味します。

コンシューマ スレッドは、以前のディクショナリ オブジェクトを「所有」し、独自の時間でその内容を処理できます。

于 2011-10-11T08:26:09.317 に答える