List <BlockingCollection <T >>线程安全吗?

Use*_*999 8 c# multithreading

我不想维护几个BlockingCollections的列表

List<BlockingCollection<ExtDocument>> a = new List<BlockingCollection<ExtDocument>>();
Run Code Online (Sandbox Code Playgroud)

如果任何"队列"仍有待处理的项目,则检查子线程:

if (a.Where(x => x.IsAddingCompleted).Count > 0)
Run Code Online (Sandbox Code Playgroud)

如果列表中的项目数在初始化后没有变化(集合中的阻止列表的内容将改变其他情况......),List<T>在这种情况下使用a 是线程安全的吗?

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

BlockingCollection<BlockingCollection<workitem>> a = new BlockingCollection<BlockingCollection<workitem>>();
Run Code Online (Sandbox Code Playgroud)

Lua*_*aan 8

使用数组代替的好处List<T>是可以使用BlockingCollection<T>.TakeFromAny和类似的方法.最有可能的是,你正在从错误的角度接近你的问题 - 你的处理线程可以简单地做BlockingCollection<T>.TryTakeFromAny,如果它是假的,你就完成了.完全线程安全,性能相当好.所以你的处理循环看起来像这样:

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

// We're done!
Run Code Online (Sandbox Code Playgroud)