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
C#Parallel.ForEach是否在集合的迭代中使用相同的线程_C#_Multithreading_Foreach_Parallel Processing_Task Parallel Library - Fatal编程技术网

C#Parallel.ForEach是否在集合的迭代中使用相同的线程

C#Parallel.ForEach是否在集合的迭代中使用相同的线程,c#,multithreading,foreach,parallel-processing,task-parallel-library,C#,Multithreading,Foreach,Parallel Processing,Task Parallel Library,我有一个IEnumerable,我想传递给Parallel.ForEach,但是IEnumerable是使用C#方法实现的,并且会产生结果,枚举器中的代码可能不是线程安全的。计划在这个问题上使用Parallel.ForEach。我假设ForEach对IEnumerable的实际内部迭代总是在同一个线程上,然后ForEach将每个项传递给另一个潜在线程进行处理。这是正确的吗 我阅读了IEnumerable迭代使用线程本地存储的地方,访问同一IEnumerable的不同线程将各自有自己的当前迭代、下

我有一个IEnumerable,我想传递给Parallel.ForEach,但是IEnumerable是使用C#方法实现的,并且会产生结果,枚举器中的代码可能不是线程安全的。计划在这个问题上使用Parallel.ForEach。我假设ForEach对IEnumerable的实际内部迭代总是在同一个线程上,然后ForEach将每个项传递给另一个潜在线程进行处理。这是正确的吗

我阅读了IEnumerable迭代使用线程本地存储的地方,访问同一IEnumerable的不同线程将各自有自己的当前迭代、下一个迭代等。这就是为什么我假设ForEach将在同一线程上实际执行所有迭代


我至少知道迭代不是在调用Parallel.ForEach的同一线程上。有点希望是因为我需要对正在进行迭代的线程进行一些线程初始化。因此,在执行迭代的线程中插入初始化可能会有问题。

不可能编写一个可以从多个线程安全迭代的
IEnumerator
。API本质上反对允许这种行为。因此,Parallel.ForEach除了从单个线程枚举序列之外别无选择。为了将迭代器直接公开给每个派生的线程,它需要使用不同于
IEnumerator
/
IEnumerable
公开的API。

我猜想您不希望在非线程安全的东西上使用多线程。我希望枚举在单个线程上是线程安全的,但是单个元素的实际处理可以在多个线程上进行,因此,从注释中可以看出,它正在同一线程中迭代元素。现在,只希望它能在主线程上完成它,或者,我猜是某种钩住它的方式。我将尝试用yields包装另一个方法,看看是否可以在生成每个元素之前初始化线程。我创建了一个生成每个项目的函数,并在输入时放置日志,同时也为每个yields放置日志。我看到它是从多个线程调用的。因此,不是从单个线程调用的。不知道这是否意味着传递给ForEach的枚举必须是线程安全的。我不确定这是否准确。只要MoveNext调用是同步的,就可以从不同的线程安全地枚举,这很容易破坏任何依赖于线程本地存储的内容。@Stillgar否,您不能从多个线程安全地枚举枚举器。首先,这样做的全部意义在于对
MoveNext
的调用不会同步。这就是将它们设计为从多个线程安全地枚举的意义。此外,人们永远无法确定
Current
的值是否实际应用于线程所做的移动;您会看到两个线程同时移动迭代器,然后都使用第二次移动的当前值。据我所知,如果您从多个线程进行迭代,每个线程都将有自己的私有迭代步骤。e、 g.如果枚举中有10个元素,每个线程将独立地迭代10个元素中的每一个(而不是一个线程得到几个,另一个线程得到几个,等等)@Ron它在单个线程上进行所有迭代,这正是我告诉过你的,因为它不可能从多个线程进行迭代。@YuvalItzchakov是的。您永远不可能知道在并发MoveNext调用存在的情况下,
Current
将返回什么。