是List <blockingcollection <t>&gt;线程安全?</blockingcollection <t>

时间:2014-09-26 11:02:42

标签: c# multithreading

我不想维护几个BlockingCollections

的列表
List<BlockingCollection<ExtDocument>> a = new List<BlockingCollection<ExtDocument>>();

如果有任何排队&#39;则检查子线程。还有待处理的项目:

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

如果列表中的项目数量在初始化后没有发生变化(内部阻止列表的内容),则List<T>在这种情况下是否使用线程安全收集将改变幕后...)?

或者我应该选择array of BlockingCollection还是以下结构:

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

1 个答案:

答案 0 :(得分:8)

使用数组而不是List<T>的一个好处是,您可以使用BlockingCollection<T>.TakeFromAny和类似的方法。最有可能的是,您从错误的角度处理问题 - 您的处理线程可能只是BlockingCollection<T>.TryTakeFromAny,如果错误,您就完成了。完全线程安全,性能相当好。所以你的处理循环看起来像这样:

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

// We're done!