【问题标题】:Track progress when using Parallel.ForEach使用 Parallel.ForEach 时跟踪进度
【发布时间】:2011-04-21 14:25:00
【问题描述】:
我正在重构我的程序以使用 Parallel.ForEach。之前,当我使用常规 for 循环时,我正在使用 Dispatcher 更新 WPF 进度条,通过将当前数组索引除以数组大小来显示完成百分比。使用并行的 foreach 循环,这将无法正确显示,即 % 随机跳跃,这是意料之中的。
如何从并行更新每个循环的 WPF 进度条,以便跟踪已完成的迭代次数?
【问题讨论】:
标签:
c#
.net
parallel-processing
【解决方案1】:
正如 SLaks 建议的那样,您应该只增加进度条的值,而不是将其设置为您从 Parallel.For 方法获得的当前索引。
但是,我会认真考虑使用比每次迭代都向 UI 线程发送消息更便宜的方法。如果您有大量迭代,那么每次迭代都发送一条消息可能会非常苛刻。您可以声明一个局部变量 count 并使用 Interlocked.Increment 在并行循环体中安全地递增变量。
然后您可以使用 if (count % 10 == 0) // ... 之类的东西仅在 10 次迭代后更新 GUI。 (这并不完全正确,因为其他线程可能会在您检查之前更新 count,但如果它只是为了 GUI 通知,那么它应该没关系 - 您绝对不想使用 lock在循环体中)。
或者,您可以创建一个计时器,它会从 GUI 线程重复检查 count 的值并更新进度条。这可能更容易,您可以保证进度条会经常更新,但不会更多。