0

我有一些代码获取名为 obj 的对象列表并将它们转换为新对象 newobj,并将它们存储在列表中。

List<SomeObject> NewListofObjects<SomeObject>();
var addListLock = new object();

Parallel.ForEach(ListofObjects, obj =>

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

lock (addListLock) 
{  
NewListofObjects.Add(newobj);                  
}

); 

if (NewListofObjectsCount == 2)
{
CombineNewObjs(NewListofObjects[0], NewListofObjects[1]);
}

代码创建新对象并将它们存储在列表中就好了。但是当我到达 CombineNewObjs(在 Parallel.ForEach 循环之外)时,我收到了这个错误:“尝试读取或写入受保护的内存。这通常表明其他内存已损坏”。

如果我以非并行顺序运行该程序,它运行良好,并且它可以正确执行所有操作,直到 CombineNewObjs。问题可能是我必须以某种方式从线程中释放我的列表,以便我可以在其上执行该方法吗?

4

2 回答 2

0

列表对象不是线程安全的。在 paralle.foreach 中使用锁来保护它是没有意义的。有线程安全的集合,例如阻塞集合,但它们具有不同的语义。

于 2013-07-03T00:46:54.510 回答
0

问题可能是我必须以某种方式从线程中释放我的列表,以便我可以在其上执行该方法吗?

不,这不是问题。问题可能出在您未显示的代码中。有可能Parallel.ForEach()只是让问题变得可见。如果不了解您的代码的更多信息,就不可能诊断出问题。

于 2013-07-03T01:30:40.763 回答