2011-10-04 21 views
5

私は繰り返し要素と同時BlockingCollectionを持っています。それを変更して別個の要素を追加または取得するにはどうすればよいですか? BlockingCollectionため同時コレクションとユニークな要素

+1

の別個の要素を追加[驚くべきハード](http://stackoverflow.com/questions/6603969/how-to-access-the-underlying-default-concurrent-queue-of-a-blocking-collection)であるように見えます不可能ではないとしても。 'BlockingCollection'は' IEnumerable 'を実装しているので、あなたは' Distinct() 'を使うことができます。 –

+0

GertArnoldによってリンクされたStackOverflow質問で提供されているコードを使用できますが、IProducerConsumerCollectionのTryAddおよびTryTake実装ではtrueを返します。これはうまくいくでしょう。私はそれがひどいフォームであることは知っていますが、動作する必要があり、BlockingCollectionは既に例外をスローするという形でフォームを破っています。どのようにひどく迷惑。 – Kevek

答えて

4

デフォルトのバッキングストアはConcurrentQueueです。他の人が指摘しているように、それを使って別個のアイテムを追加するのはむしろ困難です。

ただし、IProducerConsumerCollectionを実装する独自のコレクションタイプを作成し、BlockingCollectionコンストラクタに渡すことができます。

は、キューに現在ある項目のキーが含まれConcurrentDictionaryを想像してみてください。アイテムを追加するには、最初にTryAddを辞書に追加し、アイテムが辞書にない場合は追加してキューに追加します。 Take(およびTryTake)は、キューから次の項目を取得し、辞書から削除して戻ります。

HashTableが並行していたら好きですが、1つではないので、ConcurrentDictionaryとする必要があります。

関連する問題