1

たとえば、単一のバッキング ストアで複数の BlockingCollections をインスタンス化できるかどうかを知りたいです。

ConcurrentStack<object> theStack = new ConcurrentStack<object>();
BlockingCollection<object> blockingStack1 = new BlockingCollection<object>(theStack);
BlockingCollection<object> blockingStack2 = new BlockingCollection<object>(theStack);

この調査の動機は次のとおりです。BlockingCollectionDispose メソッドの呼び出しが必要です。これは、usingブロックを使用するとシームレスです。ただし、usingブロックは常に適切であるとは限らないため (プロデューサーとコンシューマーが異なるメソッドだけでなく異なるスレッドにも住んでいると考えてください)、Dispose を呼び出すために必要な簿記を行うことは、それほど簡単ではなくなり、エラーが発生しやすくなります。 . ただし、 を伝播するBlockingCollection代わりにバッキング ストアを伝播できれば、ブロックBlockingCollection内でローカルをローカルにインスタンス化できます。using

私の推測では、IProducerConsumerCollection インターフェイスには何もないため、BlockingCollection が依存する唯一のものであり、そうでないことを暗示しているようです。

4

1 に答える 1

0

BlockingCollection複数の を同じものでIProducerConsumerCollection安全に使用することはできません。MSDN の記事から得た情報を次に示します(複数の を使用できることを意味すると解釈される可能BlockingCollectionがあります)。

基になるコレクションを直接変更しないでください。要素を追加または削除するには、BlockingCollection メソッドを使用します。基になるコレクションを直接変更すると、BlockingCollection オブジェクトが破損する可能性があります。

ここには実装自体もあり、SemaphoreSlimをバインドするために2が使用されていBlockingCollectionます。それをサポートするように構築されていないことがわかりBlockingCollectionます。正しく動作するには、2 つのインスタンス間で内部同期オブジェクトを共有する必要があります。

2 回呼び出すことを実際に心配する必要はありませんがDispose、1 回だけ発生するはずのロックを単純に使用できるDisposeため、パフォーマンスに関しては無視できます。

于 2014-08-21T23:15:36.683 に答える