gpt4 book ai didi

c# - 同时访问 C# List 的多个索引是否安全?

转载 作者:行者123 更新时间:2023-12-03 12:45:18 27 4
gpt4 key购买 nike

我有一个充满结构的列表,我想遍历并同时更改它。

代码概念如下:

Parallel.For(0, pointsList.Count(), i=> pointsList[i] = DoThing(pointsList[i]));

我既没有添加也没有从列表中删除,只是访问和改变它的项目。

我想这很好,但我想我应该检查一下:这样可以吗,或者我是否需要在某处使用 Lock 以免弄乱列表对象?

最佳答案

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

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

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

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

pointsList = newList.ToList();

关于c# - 同时访问 C# List<T> 的多个索引是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55349362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com