List <Object>线程安全上的Parallel.ForEach

Mic*_*out 22 .net c# multithreading

就线程安全而言,这是可以的,或者我需要使用不同的集合吗?

        List<FileMemberEntity> fileInfo = getList(); 

        Parallel.ForEach(fileInfo, fileMember =>
        {
              //Modify each fileMember 
        }
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 29

只要您只修改传递给方法的项的内容,就不需要锁定.

(当然,前提是列表中没有重复引用,即对同一FileMemberEntity实例的两个引用.)

如果需要修改列表本身,请创建可以迭代的副本,并在修改列表时使用锁定:

List<FileMemberEntity> fileInfo = getList();

List<FileMemberEntity> copy = new List<FileMemberEntity>(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
});
Run Code Online (Sandbox Code Playgroud)


Hen*_*rik 9

因为你刚读书,你很安全.只是在迭代其项目时​​不要修改列表.