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文档提供了如何执行此操作的示例。