【问题标题】:Specific working example needed using IProgress interface described by Albahari使用 Albahari 描述的 IProgress 接口所需的具体工作示例
【发布时间】:2013-08-04 21:44:19
【问题描述】:

我是 C# 线程的新手。我正在努力了解如何发出 100K 网络请求,具有一定程度的并行性,并向 GUI 实时报告进度:

urls processed so far: ######
total moved so far:    ######
timed out so far:      ####3

我正在阅读 Albahari 兄弟的 C# 5.0 in a Nutshell 中的第 596 页,关于进度报告的部分。在这一点上,我看不到在 Progress 实例中这些计数器将如何以线程安全的方式递增,以及 UI 更新的确切方式/位置。即使在示例中专门讨论了写入控制台和写入 GUI 之间的区别,本书也使用了Console.WriteLine。如果有一个示例准确地显示 Progress 实例中发生的情况,我将不胜感激——例如,递增一些 int 变量并写入文本框。

【问题讨论】:

  • 您的 GUI 有一个 SynchronizationContext,您可以在其中发布您的 UI 更新。您可以在哪里发布您已经拥有的代码吗?

标签: wpf parallel-processing async-await progress c#-5.0


【解决方案1】:

我有一个walkthrough on my blog,特别指出注意事项:

  • IProgress<T>.Report 是异步的,因此如果您发送它的对象是不可变的,则效果最佳。
  • 按照惯例,传递给您的 TAP 方法的 IProgress<T> progress 可能是 null,因此请在报告进度之前检查它。
  • Progress<T> 最适用于 UI 或其他单线程 SynchronizationContext
  • Progress<T> 的处理程序引发的异常直接转到SynchronizationContext,因此请避免从进度报告处理程序抛出异常。

还有blog post hereMSDN docs都不错。

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2018-09-26
    • 2016-03-24
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多