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

本文关键字:线程 迭代 ForEach 是否 集合 C#Parallel | 更新日期: 2023-09-27 18:27:54

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

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

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

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

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