以线程安全的方式添加到Parallel.ForEach循环中的列表
我在一个名为ListofObjects的obj对象列表中有一些像这样工作的代码:
List NewListofObjects(); Parallel.ForEach(ListofObjects, obj => //Do some operations here on obj to get a newobj NewListofObjects.Add(newobj); );
现在我不在Parallel.ForEach循环中,我想对NewListofObjects进行操作。 但是,当我尝试: “尝试读取或写入受保护的内存时,我收到此错误。这通常表示其他内存已损坏”。
这是因为我的NewListofObjects.Add(newobj)方法不是线程安全的吗? 如果是这样,我怎么能让它线程安全?
这是因为我的
NewListofObjects.Add(newobj)
方法不是线程安全的吗?
正确。 它不是线程安全的。
任何实例成员都不保证是线程安全的。
这是来自MSDN引用List
(滚动到标题为“线程安全”的部分)。
如果是这样,我怎么能让它线程安全?
使用并发集合,如ConcurrentBag
。 请注意,您无法跟踪项目的插入顺序。
您可以像下面的代码一样使用locking
块以线程安全的方式将项目插入列表。
var sync = new object(); var myNewList = new List(); Parallel.ForEach(myListOfSomethings, a => { // Some other code... var someObj = new SomeObject(); // More other code... lock(sync) { myNewList.Add(someObj); } // Even more code... });
- 使用WS-Security UsernameToken PasswordDigest身份validation方案的WCF客户端使用Axis 2 Web服务时出错
- C#程序集,什么是程序集?
- 以不区分大小写的方式查找子字符串 – C#
- 动态创建Minesweeper游戏的游戏板
- 为什么我需要使用get和set?
- 无法注册时间触发的后台任务
- 没有为类型定义的序列化程序:System.Windows.Media.Media3D.Point3D
- OS X上的Mono:System.Data.SQLite不起作用
- 如何在TemplateField中更改ItemTemplate的Command Text和ImageButton