为了账号安全,请及时绑定邮箱和手机立即绑定

同时访问 C# List<T> 的多个索引是否安全?

同时访问 C# List<T> 的多个索引是否安全?

C#
弑天下 2022-11-13 14:17:25
我有一个完整的结构列表,我想迭代并同时更改。代码在概念上如下:Parallel.For(0, pointsList.Count(), i=> pointsList[i] = DoThing(pointsList[i]));我既没有添加也没有从列表中删除,只是访问和改变它的项目。我想这很好,但我想我应该检查一下:这样可以吗,还是我需要在某处使用 Lock 以免弄乱列表对象?
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

它不能保证是安全的。更改列表中的元素会增加列表的私有_version字段,这是各种线程可以判断列表是否已被修改的方式。如果任何其他线程尝试枚举列表或使用类似的方法,List<T>.ForEach()则可能存在问题。这听起来非常罕见,这不一定是好事——事实上,它会导致最令人抓狂的缺陷类型。

如果您想安全起见,请创建一个新列表,而不是更改现有列表。这是避免锁定的线程问题的常见“功能”方法。

var newList = pointsList.AsParallel().Select( item => DoThing(item) );

完成后,您可以根据需要随时替换旧列表。

pointsList = newList.ToList();


查看完整回答
反对 回复 2022-11-13
  • 1 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信