List 线程安全上的Parallel.ForEach
就线程安全问题而言,可以做或者我需要使用不同的集合吗?
List fileInfo = getList(); Parallel.ForEach(fileInfo, fileMember => { //Modify each fileMember }
只要您只修改传递给方法的项的内容,就不需要锁定。
(当然,列表中没有重复的引用,即对同一个FileMemberEntity
实例的两个引用。)
如果需要修改列表本身,请创建可以迭代的副本,并在修改列表时使用锁定:
List fileInfo = getList(); List copy = new List (fileInfo); object sync = new Object(); Parallel.ForEach(copy, fileMember => { // do something lock (sync) { // here you can add or remove items from the fileInfo list } // do something });
因为你刚读书,所以你很安全。 只是在迭代其项目时不要修改列表。
我们应该使用较少的锁定对象来使其更快。 只在Parrallel.ForEach的不同本地线程中锁定对象:
List copy = new List (fileInfo); object sync = new Object(); Parallel.ForEach>( copy, () => { return new List (); }, (itemInCopy, state, localList) => { // here you can add or remove items from the fileInfo list localList.Add(itemInCopy); return localList; }, (finalResult) => { lock (sync) copy.AddRange(finalResult); } ); // do something
参考: http : //msdn.microsoft.com/en-gb/library/ff963547.aspx
如果对FileMemberEntity
对象的操作顺序FileMemberEntity
,则可以使用List
因为您没有修改列表。
如果必须确保某种排序,可以使用OrderablePartitioner
作为基类并实现适当的分区方案。 例如,如果FileMemberEntity
具有某种分类,并且您必须按某种特定顺序处理每个类别,那么您可能希望使用此路由。
假如你有假设
对象1类别A.
对象2类别A.
对象3类别B.
在使用Parallel.ForEach
迭代List
时,无法保证在处理Object 3 Category B
之前处理Object 2 Category A
您链接到的MSDN文档提供了如何执行此操作的示例。