使用Albahari描述的IProgress接口需要具体的工作示例

时间:2013-08-03 20:18:44

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

我是C#线程的新手。我试图了解如何制作100K Web请求,具有一定程度的并行性,并实时向GUI报告进度:

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

我正在阅读Albahari兄弟的 C#5.0 in a Nutshell 中的第596ff页,这是关于进展报告的部分。此时,我没有看到在Progress实例中这些计数器将如何以线程安全的方式递增,以及UI的更新方式。在示例中,专门讨论写入控制台和写入GUI之间的差异,本书使用Console.WriteLine。我要感谢一个示例,它显示了Progress实例中发生了什么 - 例如,增加一些int变量并写入文本框。

1 个答案:

答案 0 :(得分:0)

我有walkthrough on my blog,特别指出了警告:

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

还有一个blog post hereMSDN docs非常好。