Jac*_*ack 3 c# multithreading list
我有一个充满结构的列表,我想同时遍历和更改这些结构。
代码概念如下:
Parallel.For(0, pointsList.Count(), i=> pointsList[i] = DoThing(pointsList[i]));
Run Code Online (Sandbox Code Playgroud)
我既没有添加到列表中也没有从列表中删除,只是访问和改变它的项目。
我想这很好,但我想我应该检查一下:这是否可以,或者我是否需要在某处使用 Lock 以免我弄乱了列表对象??
它不能保证是安全的。更改列表中的元素会增加列表的私有_version字段,这是各种线程可以判断列表是否已被修改的方式。如果任何其他线程尝试枚举列表或使用类似的方法,List<T>.ForEach()则可能存在问题。听起来它非常罕见,这不一定是件好事——事实上,它是最令人抓狂的缺陷类型。
如果您想安全,请创建一个新列表而不是更改现有列表。这是避免锁定的线程问题的常见“功能”方法。
var newList = pointsList.AsParallel().Select( item => DoThing(item) );
Run Code Online (Sandbox Code Playgroud)
完成后,您可以随时根据需要替换旧列表。
pointsList = newList.ToList();
Run Code Online (Sandbox Code Playgroud)