首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能把多个BlockingCollections包裹在一个备份存储上吗?

你能把多个BlockingCollections包裹在一个备份存储上吗?
EN

Stack Overflow用户
提问于 2014-08-21 22:58:58
回答 1查看 89关注 0票数 1

我想知道是否可以用一个备份存储来实例化多个BlockingCollections,例如:

代码语言:javascript
复制
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所依赖的唯一东西,似乎意味着并非如此。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-21 23:15:36

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

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

我们还有实现本身的这里,在这里我们看到两个SemaphoreSlim被用来绑定BlockingCollection。我们可以看到,构建BlockingCollection并不是为了支持它,而是必须在两个实例之间共享它的内部同步对象,才能正确地操作。

您实际上不需要担心调用Dispose两次,但是您可以简单地使用Dispose周围的锁,该锁应该只发生一次,因此在性能上可以忽略不计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25437228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档