Parallel.ForEach的名单,其中,对象>线程安全线程、对象、名单、安全

2023-09-03 16:01:56 作者:国际难民

至于线程安全的推移这是确定在做我需要使用不同的集合?

 名单,其中,FileMemberEntity>的fileInfo =的GetList();

        Parallel.ForEach(的fileInfo,fileMember =>
        {
              //修改每个fileMember
        }
 

解决方案

只要你只是修改传递给方法的项目的内容,也没有必要锁定。

(前提当然是有列表中没有重复的参考,即两个引用相同的 FileMemberEntity 实例。)

如果您需要修改列表本身,创建可重复的副本,并使用锁,当你修改列表:

 名单,其中,FileMemberEntity>的fileInfo =的GetList();

名单< FileMemberEntity>复制=新的名单,其中,FileMemberEntity>(的fileInfo);
对象同步=新的对象();

Parallel.ForEach(复制,fileMember => {
  // 做一点事
  锁(同步){
    //这里你可以添加或删除FileInfo的列表项
  }
  // 做一点事
});
 
AMD新锐龙7 5800X 锐龙5 5600X性能偷跑,实力抢眼

As far as Thread Safety goes is this ok to do or do I need to be using a different collection ?

        List<FileMemberEntity> fileInfo = getList(); 

        Parallel.ForEach(fileInfo, fileMember =>
        {
              //Modify each fileMember 
        }

解决方案

As long as you are only modifying the contents of the item that is passed to the method, there is no locking needed.

(Provided of course that there are no duplicate reference in the list, i.e. two references to the same FileMemberEntity instance.)

If you need to modify the list itself, create a copy that you can iterate, and use a lock when you modify the list:

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
});