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

2024-03-03

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

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

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


It's 不可能的写一个IEnumerator可以安全地从多个线程迭代。 API 本质上是反对允许这种行为的。因此,Parallel.ForEach 别无选择,只能从单个线程枚举序列。为了将迭代器直接暴露给每个生成的线程,它需要使用不同的 APIIEnumerator/IEnumerable expose.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# Parallel.ForEach 是否使用相同的线程来迭代集合 的相关文章

随机推荐