我想知道是否可以使用单个后备存储实例化多个BlockingCollections:
ConcurrentStack<object> theStack = new ConcurrentStack<object>();
BlockingCollection<object> blockingStack1 = new BlockingCollection<object>(theStack);
BlockingCollection<object> blockingStack2 = new BlockingCollection<object>(theStack);
此调查的动机如下: BlockingCollection
需要调用它的Dispose方法。这与使用using
块无缝连接。但是,由于using
块并不总是合适的(考虑到生产者和消费者不仅生活在不同的方法中,而且生活在不同的线程上),尝试进行调用Dispose所需的簿记变得不那么重要了。更容易出错。但是,如果不是传播BlockingCollection
,而是传播后备存储,则可以在BlockingCollection
块内本地实例化本地using
。
我的猜测是你可以,因为IProducerConsumerCollection接口中没有任何东西,BlockingCollection唯一依赖的东西,这似乎暗示了其他。
答案 0 :(得分:0)
您无法安全使用具有相同BlockingCollection
的多个IProducerConsumerCollection
。以下是我们从MSDN article获得的一些信息(可能可能意味着您可以使用多个BlockingCollection
):
请勿直接修改基础集合。使用BlockingCollection方法添加或删除元素。如果直接更改基础集合,则BlockingCollection对象可能会损坏。
我们还有自己的实现here,其中我们看到2 SemaphoreSlim
用于绑定BlockingCollection
。我们可以看到BlockingCollection
没有构建来支持它,并且必须在2实例之间共享其内部同步对象才能正常运行。
你真的不必担心两次调用Dispose
,但你可以简单地使用围绕Dispose
的锁,这应该只发生一次,因此性能可以忽略不计。