List<BlockingCollection<T>> Thread安全吗?



我不想维护几个BlockingCollections 的列表

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>>();

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

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

最新更新