Con*_*nor 14 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);
);
Run Code Online (Sandbox Code Playgroud)
现在我不在Parallel.ForEach循环中,我想对NewListofObjects进行操作.但是,当我尝试:"尝试读取或写入受保护的内存时,我收到此错误.这通常表明其他内存已损坏".
这是因为我的NewListofObjects.Add(newobj)方法不是线程安全的吗?如果是这样,我怎样才能使它成为线程安全的?
jas*_*son 29
这是因为我的
NewListofObjects.Add(newobj)方法不是线程安全的吗?
正确.它不是线程安全的.
任何实例成员都不保证是线程安全的.
这是来自MSDN引用List<T>(滚动到标题为"线程安全"的部分).
如果是这样,我怎样才能使它成为线程安全的?
使用并发集合,如ConcurrentBag<T>.请注意,您无法跟踪项目的插入顺序.
aja*_*987 16
您可以locking像以下代码一样使用块以线程安全的方式将项目插入列表.
var sync = new object();
var myNewList = new List<SomeObject>();
Parallel.ForEach(myListOfSomethings, a =>
{
// Some other code...
var someObj = new SomeObject();
// More other code...
lock(sync)
{
myNewList.Add(someObj);
}
// Even more code...
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24545 次 |
| 最近记录: |