c# - 以线程安全的方式添加到 Parallel.ForEach 循环中的列表

标签 c# multithreading

我有一些代码在名为 ListofObjects 的 obj 对象列表上像这样工作:

List<SomeObject> NewListofObjects<SomeObject>();

Parallel.ForEach(ListofObjects, obj =>

//Do some operations here on obj to get a newobj

NewListofObjects.Add(newobj);

);

现在我退出了 Parallel.ForEach 循环,我想对 NewListofObjects 进行操作。但是,当我尝试执行以下操作时出现此错误:“尝试读取或写入 protected 内存。这通常表示其他内存已损坏”。

这是因为我的 NewListofObjects.Add(newobj) 方法不是线程安全的吗?如果是这样,我怎样才能使其成为线程安全的?

最佳答案

Is this because my NewListofObjects.Add(newobj) method is not threadsafe?

正确。它不是线程安全的。

Any instance members are not guaranteed to be thread safe.

来自 MSDN引用List<T> (滚动到标题为“线程安全”的部分)。

If so, how can I make it threadsafe?

使用并发集合,例如 ConcurrentBag<T> .请注意,您无法跟踪项目的插入顺序。

关于c# - 以线程安全的方式添加到 Parallel.ForEach 循环中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416357/

相关文章:

c# - 为什么异步方法不立即返回可等待对象?

c# - 将文件即时上传到 Azure Blob

c# - Stream写字符串和byte[]数组?

java - 仅具有局部变量的实例方法的线程安全

c# - IEnumerable 与 IQueryable

c# - 如何在面板内添加换行符或 html?

linux - 使用 Linux 线程优先级和调度策略的指南?

c++ - 多线程和类的全局实例?

multithreading - 我可以根据 ProcessID 和 ThreadID 创建唯一的文件名吗?

java - 如何正确创建 SynchronizedStack 类?