1

我想知道是否可以使用单个后备存储实例化多个 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 所需的簿记变得不那么琐碎,而且更容易出错. 但是,如果不是传播 a BlockingCollection,而是传播后备存储,则BlockingCollection可以在using块内本地实例化一个本地。

我的猜测是您可以,因为 IProducerConsumerCollection 接口中没有任何内容,这是 BlockingCollection 唯一依赖的东西,这似乎暗示了其他情况。

4

1 回答 1

0

您不能安全地使用BlockingCollection相同的多个 s IProducerConsumerCollection。以下是我们从MSDN 文章中获得的一些信息(这可能意味着您可以使用多个BlockingCollection):

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

我们在这里也有实现本身,我们看到 2SemaphoreSlim用于绑定BlockingCollection. 我们可以看到它BlockingCollection不是为了支持它而构建的,并且必须在 2 个实例之间共享其内部同步对象才能正确运行。

你真的不需要担心调用Dispose两次,但你可以简单地使用一个锁,Dispose这应该只发生一次,所以性能可以忽略不计。

于 2014-08-21T23:15:36.683 回答