【问题标题】:Checking status of parallel foreach loop检查并行 foreach 循环的状态
【发布时间】:2010-09-28 03:28:08
【问题描述】:

我需要运行一个相当长的并行 foreach 循环。将访问网络上的 100 多台计算机,每台计算机上的每个操作都需要几秒钟的时间。并行 foreach 循环似乎是加快进程的完美解决方案。

您想出了哪些视觉线索可以让用户轻松查看循环的进度?显然因为是多线程更新 GUI 既昂贵又冒险,所以我的问题是还有哪些可视化指标可以用来显示进度?

【问题讨论】:

  • "视觉指示器可以用来显示进度吗?"始终处于多威胁状态,否则在任务期间您将看不到任何更新。

标签: c# .net


【解决方案1】:

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

作为一个非常简单的例子,如果您的代码可以被视为一系列重复的步骤,您可以只增加一个计数器。 Interlocked.Increment() 方法对此特别有用,因为它不需要锁。然后,您的 UI 线程可以定期轮询此计数器并报告其值 - 或尽可能将其可视化(可能是进度条或运行平均值)。

如果涉及多台机器,则为每台机器设置一个计数器并报告整个任务在参与的对等方之间的进展情况可能是有意义的。您还可以考虑将完成步骤之间的平均经过时间可视化...这可以帮助系统用户估计完成时间(您也可以计算此时间)。

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

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

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

【讨论】:

  • 我决定使用带有计时器类的 Interlocked.Increment(),该计时器类使用计数器更新标签。我真的很喜欢其他想法,当我有更多时间时一定会检查它们!
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2017-02-04
  • 1970-01-01
  • 2021-08-09
  • 2021-12-12
  • 2012-07-28
相关资源
最近更新 更多