2014-09-26 68 views
7

我wan't维持几个BlockingCollections是否列表<BlockingCollection <T>>线程安全吗?

List<BlockingCollection<ExtDocument>> a = new List<BlockingCollection<ExtDocument>>(); 

列表,并在子线程检查是否有任何“队列”中仍然有悬而未决的项目:

if (a.Where(x => x.IsAddingCompleted).Count > 0) 

是一个List<T>的使用在这种情况下,线程安全如果在初始化后(该集合中的阻塞列表的内容将改变过场......)列表中的项目数量没有变化?

或者我应该选择一个array of BlockingCollection或以下建筑:

BlockingCollection<BlockingCollection<workitem>> a = new BlockingCollection<BlockingCollection<workitem>>(); 
+7

如果列表在初始化后没有改变,那么使用列表就完全没问题。只有阅读不是并发的问题,它的可变性最终使它成为问题。 – Caramiriel 2014-09-26 11:05:17

+6

我宁愿使用一个数组而不是'List '。这样更清楚的是项目的数量不会改变。 – CodesInChaos 2014-09-26 11:08:29

+0

@ Caramiriel感谢您的信息! CodesInChaos:感谢您的提示。当你有能力使用.NET框架4.5(T []'继承)时,这确实会增加未来程序员 – User999999 2014-09-26 11:11:34

回答

7

使用数组,而不是List<T>一个很好的好处是,你可以再使用BlockingCollection<T>.TakeFromAny和类似的方法。最有可能的是,你从错误的角度接近你的问题 - 你的处理线程可以简单地做BlockingCollection<T>.TryTakeFromAny,如果它是假的,你就完成了。完全线程安全,而且表现良好。所以你的处理循环看起来是这样的:

while (BlockingCollection<ExtDocument>.TryTakeFromAny(collections, out workItem) >= 0) 
{ 
    // Do work on workItem 
} 

// We're done! 
+0

确实不错。必须在msdn页面上阅读。很快就会测试! – User999999 2014-09-26 11:45:56

+0

事实上,我的代码远远好于以前的版本。日Thnx! – User999999 2014-09-26 12:18:21

相关问题