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