检查并行foreach循环的状态

4
我有一个很长的并行foreach循环需要运行。将访问网络上的100多台计算机,并且每个计算机上的每个操作都需要几秒钟。并行foreach循环似乎是加速此过程的完美解决方案。
您能想到什么视觉线索可以使用户轻松地看到循环的进度?显然,由于它是多线程的,更新GUI是昂贵和有风险的,因此我的问题是还有哪些其他可视指标可用于显示进度?

“可视化指示器可以用来显示进度?”在任务执行期间,它们始终是多线程的,否则您将看不到任何更新。 - RvdK
1个回答

5

你不应该直接从后台代码更新UI线程,但是可以考虑更新某些共享内存以传达进度。

举个简单的例子,如果你的代码可以被视为一系列重复的步骤,那么你只需增加一个计数器。 Interlocked.Increment() 方法对此非常有帮助,因为它可以在不需要锁定的情况下完成。然后,你的UI线程可以定期轮询这个计数器并报告它的值 - 或者如果可能的话将其可视化(例如作为进度条或平均运行时间)。

如果涉及多台机器,则可能有意义保持每台机器的计数器,并报告参与同龄人的任务整体进展情况。您还可以考虑可视化完成步骤之间的平均经过时间...这可能有助于系统用户估计完成时间(您也可以计算此时间)。

还有可能实现更复杂的方法。例如,您可以创建一个共享队列,其中发布日志信息或每个活动状态。这可能会变得非常复杂...如果实现不当可能会对性能产生不利影响。

或者,如果您想收集有关分布式进程的大量性能指标,则可以考虑使用Performance Counters APISystem.Diagnostics中。这是一条更复杂的路径 - 但它允许您利用操作系统中高性能的度量收集和发布实现,并允许您使用像Perfmon这样的工具观察和聚合性能信息。

你用来更新UI的具体机制取决于你使用的技术(WPF、WinForms、HTML)以及分布式代码和UI代码是否有任何组件在单个进程中共存。如果分布式/UI部分不托管在单个进程中,你可能需要使用某种形式的IPC来通信和可视化进度。


我决定使用Interlocked.Increment()和一个计时器类来更新标签计数器。我真的很喜欢其他的想法,当我有更多时间时一定会去尝试它们! - DTown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接