我想知道是否可以用一个备份存储来实例化多个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所依赖的唯一东西,似乎意味着并非如此。
发布于 2014-08-21 23:15:36
您不能安全地使用具有相同IProducerConsumerCollection的多个IProducerConsumerCollection。下面是我们从MSDN文章获得的一些信息(这可能意味着您可以使用一个以上的BlockingCollection):
不要直接修改基础集合。使用BlockingCollection方法添加或删除元素。如果直接更改基础集合,BlockingCollection对象可能会损坏。
我们还有实现本身的这里,在这里我们看到两个SemaphoreSlim被用来绑定BlockingCollection。我们可以看到,构建BlockingCollection并不是为了支持它,而是必须在两个实例之间共享它的内部同步对象,才能正确地操作。
您实际上不需要担心调用Dispose两次,但是您可以简单地使用Dispose周围的锁,该锁应该只发生一次,因此在性能上可以忽略不计。
https://stackoverflow.com/questions/25437228
复制相似问题