Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Parallel.ForEach循环终止后是否所有线程都被终止?_C#_Multithreading_Parallel Processing_Task Parallel Library - Fatal编程技术网

C# Parallel.ForEach循环终止后是否所有线程都被终止?

C# Parallel.ForEach循环终止后是否所有线程都被终止?,c#,multithreading,parallel-processing,task-parallel-library,C#,Multithreading,Parallel Processing,Task Parallel Library,我有一些代码,它获取一个名为obj的对象列表,并将它们转换为新对象newobj,将它们存储在一个列表中 List NewListofObjects(); var addListLock=新对象(); Parallel.ForEach(对象列表,obj=> //在obj上执行一些操作以获得新的obj 锁(addListLock) { 添加(newobj); } ); if(newListofObject==2) { CombineNewObjects(NewListofObjects[0],

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

List NewListofObjects();
var addListLock=新对象();
Parallel.ForEach(对象列表,obj=>
//在obj上执行一些操作以获得新的obj
锁(addListLock)
{  
添加(newobj);
}
); 
if(newListofObject==2)
{
CombineNewObjects(NewListofObjects[0],NewListofObjects[1]);
}
代码创建新对象并将它们存储在列表中。但是,当我访问CombineWobJS(位于Parallel.ForEach循环之外)时,我会遇到以下错误:“试图读取或写入受保护的内存。这通常表示其他内存已损坏”。


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

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

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


不,这不是问题所在。问题可能出在您没有显示的代码中。有可能是
Parallel.ForEach()
使问题变得显而易见。如果不了解更多有关代码的信息,就无法诊断问题。

您好,欢迎光临!这个问题和你的不同吗?他们看起来几乎一模一样。为了帮助我们帮助您,请确保您发布的代码已编译。这不是。你好,谢谢你的欢迎!是的,此问题涉及Parallel.ForEach的结构,询问是否在循环终止后终止所有线程,或者是否必须在终止后采取特殊步骤以访问从循环中创建的资源。我之前的问题涉及列表本身是否本质上是线程安全的。不幸的是,我的代码需要一个GIS SDK来编译,因此如果没有安装必要的软件,这里的大多数用户将无法编译它。这就是为什么我选择处理简单的抽象,而不是发布我的实际代码。请用您的评论编辑您的问题/标题。现在的帖子与上面的评论无关。一般来说,如果你的示例代码不能重现这个问题,那么很难给出答案(除非问题非常明显)。从我们的立场来看,我们所拥有的只是你们提供的。至少尝试修复语法错误,并尝试不使用尚未提供详细信息的自定义方法。感谢您的反馈。我希望从总体上更好地理解并行性,所以我要做的是将这个问题标记为版主删除,并将其作为一个更具概念性的问题重新发布,而不使用代码。使用这样的锁是安全的,而且非常有意义,假设转换操作需要很长时间。我没有看到是两个列表。我以为他锁定了他正在迭代的同一个列表。如果有两个列表,这有一些价值,但仍然不是我所说的好习惯用法。创建生成任务,然后添加项目的任务可能是更好的选择
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]);
}