你能在一个支持商店周围包装多个BlockingCollections吗?

时间:2014-08-21 22:58:58

标签: c# .net idisposable blockingcollection

我想知道是否可以使用单个后备存储实例化多个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唯一依赖的东西,这似乎暗示了其他。

1 个答案:

答案 0 :(得分:0)

您无法安全使用具有相同BlockingCollection的多个IProducerConsumerCollection。以下是我们从MSDN article获得的一些信息(可能可能意味着您可以使用多个BlockingCollection):

  

请勿直接修改基础集合。使用BlockingCollection方法添加或删除元素。如果直接更改基础集合,则BlockingCollection对象可能会损坏。

我们还有自己的实现here,其中我们看到2 SemaphoreSlim用于绑定BlockingCollection。我们可以看到BlockingCollection没有构建来支持它,并且必须在2实例之间共享其内部同步对象才能正常运行。

你真的不必担心两次调用Dispose,但你可以简单地使用围绕Dispose的锁,这应该只发生一次,因此性能可以忽略不计。