我正在重构我的程序以使用 Parallel.ForEach。之前,当我使用常规 for 循环时,我使用 Dispatcher 更新 WPF 进度条,通过将当前数组索引除以数组大小来显示完成百分比。对于并行的 foreach 循环,这不会正确显示,即 % 随机跳跃,这是预期的。
如何为每个循环更新并行的 WPF 进度条,以便跟踪已完成的迭代次数?
最佳答案
正如 SLaks 所建议的,您应该只增加进度条值,而不是将其设置为您从 Parallel.For
方法获得的当前索引。
但是,我会认真考虑使用一些比在每次迭代时向 UI 线程发送消息更便宜的方法。如果您有大量迭代,那么每次迭代都发送一条消息可能要求很高。您可以声明一个局部变量 count
并使用 Interlocked.Increment
在并行化循环的主体中安全地递增该变量。
然后您可以使用类似
if (count % 10 == 0)//...
的方法仅在 10 次迭代后更新 GUI。 (这不完全正确,因为其他线程可能会在您检查之前更新count
,但如果它只是为了 GUI 通知的目的,那么它应该无关紧要 - 您肯定不希望在循环体中使用lock
)。或者,您可以创建一个计时器,它会从 GUI 线程重复检查
count
的值并更新进度条。这或许更容易,您可以保证进度条的更新频率足够高,但不会超过。
关于c# - 使用 Parallel.ForEach 时跟踪进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868920/