c# - 使用 Parallel.ForEach 时跟踪进度

标签 c# .net parallel-processing

我正在重构我的程序以使用 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/

相关文章:

c++ - 将 vector 并行保存到文件

c# - 在这种情况下 (C#) 替换开关 block 和枚举的正确方法是什么?

c# - C# 中的 GetResponse()

c# - 记录复杂类型的描述

c# - 有没有办法让 _ 在没有 Alt 键的情况下出现在热键上?

c# - 使用 .NET 代码将系统时间同步到域 Controller

c# - 如何对 Excel 列进行数字排序

c++ - 使用 openMP 的并行 qsort

c# - 在数据库中搜索值并获取信息 c# Forms

R - 并行运行时获取工作人员名称