我有一些代码可以获取名为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。可能问题是我必须以某种方式从线程中释放我的列表,以便我可以在其上执行该方法吗?
答案 0 :(得分:0)
列表对象不是线程安全的。使用锁来保护它在paralle.foreach内是没有意义的。有线程安全的集合,如blocking collection,但它们有不同的语义。
答案 1 :(得分:0)
问题是我必须以某种方式从线程中释放我的列表,以便我可以在其上执行该方法吗?
不,那不是问题。问题可能出在您未显示的代码中。 Parallel.ForEach()
可能只是让问题可见。如果不了解您的代码,就无法诊断问题。