以线程安全的方式添加到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... });