c# - 检查并行 foreach 循环的状态

标签 c# .net

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

您能够想出哪些视觉线索可以让用户轻松看到循环的进度?显然,因为它是多线程更新 GUI 是昂贵且有风险的,所以我的问题是还有哪些其他可视指示器可以用来显示进度?

最佳答案

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

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

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

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

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

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

关于c# - 检查并行 foreach 循环的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3807041/

相关文章:

c# - CheckBox.IsChecked.HasValue 何时变为 false?

c# - GetTempFileName() 和正确的文件扩展名

c# - 哪些 C# 数据类型可以是可空类型?

c# - 避免 InvalidOperationException : Collection was modified? 的最佳实践

c# - .NET MVC3 首选模型初始化

c# - 如何在域中以模拟用户身份运行提升的命令

c# - 如何制作对象脸播放器?

c# - 短弱引用和长弱引用有什么区别?

c# - System.Data.Entity.Infrastructure.UnintentionalCodeFirstException 未被用户代码 HResult=-2146233079 处理

c# - 比较两个值是否相等的最有效方法是什么?