Parallel.ForEach的名单,其中,对象>线程安全 [英] Parallel.ForEach on List<Object> Thread Safety

查看:140
本文介绍了Parallel.ForEach的名单,其中,对象>线程安全的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

解决方案

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

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

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

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

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

Parallel.ForEach(复制,fileMember => {
  // 做一点事
  锁(同步){
    //这里你可以添加或删除FileInfo的列表项
  }
  // 做一点事
});
 

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

这篇关于Parallel.ForEach的名单,其中,对象&gt;线程安全的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆