我需要运行一个相当长的并行foreach循环。将访问网络上的100多台计算机,每台计算机上的每个操作都将花费几秒钟。平行的foreach循环似乎是加速过程的完美解决方案。
您能够提出哪些视觉线索,以便用户轻松查看循环的进度?显然,因为它是多线程更新GUI是昂贵且有风险的,所以我的问题是可以使用其他可视指示器来显示进度吗?
答案 0 :(得分:5)
那么你不应该直接从后台代码更新UI线程,但你当然可以考虑更新一些共享内存以传达进度。
作为一个非常简单的示例,如果您的代码可以被视为一系列重复步骤,则可以只增加一个计数器。 Interlocked.Increment()
方法对此目的特别有用,因为它不需要锁定。然后,您的UI线程可以定期轮询此计数器并报告其值 - 或者在可能的情况下将其可视化(可能是进度条或运行平均值)。
如果涉及多台计算机,则可以为每台计算机保留一个计数器,并报告整个任务在各参与对象之间的进展情况。您还可以考虑可视化已完成步骤之间的平均经过时间...这可以帮助系统用户估计完成时间(您也可以计算它)。
也可以实现更复杂的实施。例如,您可以创建一个共享队列,您可以向其发布日志记录信息或每个活动状态。这可能变得相当复杂......如果实施不当可能会对性能产生负面影响。
或者,如果您想收集大量有关分布式流程的效果指标,可以考虑使用Performance Counters API中的System.Diagnostics。这是一个更复杂的路径 - 但它允许您利用操作系统中的高性能度量标准收集和发布实现,并允许您使用Perfmon等工具观察和聚合性能信息。
用于更新UI的特定机制取决于您使用的技术(WPF,WinForms,HTML)以及分布式代码和UI代码是否具有共同位于单个进程中的任何组件。如果分布式/ UI部分不在单个进程中托管,您可能需要使用某种形式的IPC来进行通信并可视化进度。