【发布时间】:2014-12-20 15:14:42
【问题描述】:
我有一个要传递给 Parallel.ForEach 的 IEnumerable,但 IEnumerable 是使用 C# 方法和 yield 实现的,并且枚举器中的代码可能不是线程安全的。计划在此使用 Parallel.ForEach。我假设 ForEach 的 IEnumerable 的实际内部迭代始终在同一个线程上,然后 ForEach 将每个项目传递给潜在的其他线程进行处理。这是正确的吗?
我读到了 IEnumerable 迭代使用线程本地存储的地方,访问同一个 IEnumerable 的不同线程每个都有自己的迭代当前、下一个等。这就是为什么我假设 ForEach 实际上会在同一个线程上进行所有迭代.
我至少知道迭代不在调用 Parallel.ForEach 的同一线程上。有点希望这是因为我需要为正在执行迭代的线程做一些线程初始化。所以这里可能有一个问题,将我的初始化注入到执行迭代的线程中。
【问题讨论】:
-
我想你不想在线程不安全的东西上使用多线程。
-
我希望枚举在单个线程上是线程安全的,但单个元素的实际处理可以在多个线程上进行。
-
因此,从 cmets 听起来它正在迭代同一线程中的元素。现在,只希望它会在主线程上完成,或者,我猜想某种方式来挂钩它。我将尝试用 yield 包装另一个方法,看看是否可以在产生每个元素之前初始化线程
-
我创建了一个产生每个项目的函数,并在输入时放置日志以及每个收益,我看到它是从多个线程调用的。所以,不是从单个线程调用的。想知道这是否意味着我传递给 ForEach 的枚举必须是线程安全的。
标签: c# multithreading foreach parallel-processing task-parallel-library