C# 是一个列表<;阻止收集<;T>&燃气轮机;线程安全?

C# 是一个列表<;阻止收集<;T>&燃气轮机;线程安全?,c#,multithreading,C#,Multithreading,我不想保留一份有几个 在这种情况下,如果列表中的项目数在初始化后没有改变,那么使用线程安全吗 或者我应该选择BlockingCollection的数组还是以下构造: BlockingCollection<BlockingCollection<workitem>> a = new BlockingCollection<BlockingCollection<workitem>>(); BlockingCollection a=new Blocking

我不想保留一份有几个

在这种情况下,如果列表中的项目数在初始化后没有改变,那么使用线程安全吗

或者我应该选择BlockingCollection的
数组还是以下构造:

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

使用数组而不是
列表
的一个好处是,您可以使用
BlockingCollection.take from any
和类似的方法。最有可能的是,您从错误的角度处理问题-您的处理线程可以简单地执行
阻塞收集。尝试从任何
执行,如果为false,则完成。完全线程安全,性能相当好。因此,您的处理循环将如下所示:

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

// We're done!
while(BlockingCollection.TryTakeFromAny(collections,out workItem)>=0)
{
//在工作项目上工作
}
//我们完了!

如果列表在初始化后没有改变,那么只使用列表就可以了。只有读取不是并发性的问题,是它的易变性最终使它成为一个问题。我宁愿使用数组而不是
List
。这样一来,物品的数量就不会改变,这一点就更清楚了。@Caramiriel谢谢你提供的信息!代码混乱:谢谢你的提示。当您能够使用.NET framework 4.5(顺便说一句,
T[]
继承了它)时,这确实会增加未来编程人员或
IReadOnlyList
的可读性。这可能有些过分,但您也可以研究一下。A或者也许。确实很好。一定已经在msdn页面上读过了。很快就会测试它!实际上,这比我使用的代码thusfar要好得多。Thnx!
BlockingCollection<BlockingCollection<workitem>> a = new BlockingCollection<BlockingCollection<workitem>>();
while (BlockingCollection<ExtDocument>.TryTakeFromAny(collections, out workItem) >= 0)
{
  // Do work on workItem
}

// We're done!