检查并行foreach循环的状态
我有一个相当长的并行foreach循环,我需要运行。网络上将会有超过100台计算机被访问,每台计算机上的每个操作都需要几秒钟的时间。并行的foreach循环似乎是加速这个过程的完美解决方案。检查并行foreach循环的状态
你能想出什么样的视觉线索能够让用户更容易地看到循环的进展?很明显,因为它是多线程更新的GUI,代价昂贵且风险很大,所以我的问题是可以使用其他可视指标来显示进度?
那么你不应该直接从后台代码更新UI线程,但你当然可以考虑更新一些共享的内存来沟通进度。
作为一个非常简单的例子,如果您的代码可以被视为一系列重复步骤,您可以只增加一个计数器。 Interlocked.Increment()
方法对此目的特别有用,因为它不需要锁定。然后,您的UI线程可以定期轮询此计数器并报告它的价值 - 或者在可能的情况下对其进行可视化(或许是进度条或平均运行时间)。
如果涉及多台机器,每台机器保留一个计数器并报告整个任务在参与同行中的进展情况可能是有意义的。你也可以考虑可视化已完成步骤之间的平均流逝时间......这可以帮助系统用户估计完成时间(也可以计算这个时间)。
更复杂的实现也是可能的。例如,您可以创建一个共享队列,您可以在其中发布日志记录信息或每个活动状态。这可能会非常复杂......如果执行得不好可能会对性能产生不利影响。
或者,如果您希望收集大量有关您的分布式过程的性能指标,可以考虑使用System.Diagnostics中的Performance Counters API。这是一条更复杂的路径 - 但它可以让您利用操作系统中的高性能指标收集和发布实施,并允许您使用工具(如Perfmon)观察和汇总性能信息。
您用于更新UI的具体机制取决于您使用的是什么技术(WPF,WinForms,HTML)以及分布式代码和UI代码是否在同一个进程中共同位于任何组件。如果分布式/ UI部分未托管在单个进程中,那么您可能需要使用某种形式的IPC来进行通信并将进度可视化。
我决定与Interlocked.Increment()一起使用计时器类来更新计数器的标签。我真的很喜欢其他的想法,并且当我有更多时间时一定会检查它们! – DTown 2010-09-27 19:55:27
http://ajaxload.info/ :) – 2010-09-27 19:19:52
“视觉指标可以用来显示进度?”总是多处理的,否则在任务期间你不会看到任何更新。 – RvdK 2010-09-27 19:32:50