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