【发布时间】:2014-07-18 12:18:11
【问题描述】:
我有一个应用程序,它从 Web 获取大量信息并将其显示在带有 WPF 的窗口中。信息获取当然是在几个后台线程中完成的;它们中的大多数不应该是非常密集的计算(除了一些文本解析),而是主要依赖于获取网络内容(webclient.Download.. 和类似的)。
因为我必须发送很多请求,所以我启动了很多线程,否则用户将不得不等待数小时才能完成加载所有内容;由于其中许多线程主要等待来自网络的数据和/或开始对 Web 服务的新请求,因此理论上这应该不是问题。然而,在实践中,调度程序的性能通常比没有线程运行时要差得多。
后台线程由 TPL 数据流管道和 Parallel.ForEach 方法的混合创建。我也已经尝试通过指定 MaxThreads 来限制线程的数量,但是由于任何数据流块都可以启动 Parallel.Foreach 块,我认为这不太好用。
有没有其他方法可以提高调度程序的优先级、性能或减少卡顿?
编辑:任务/线程的数量通常在 50-100 之间,在最坏的情况下可能会更多。 weblookup 的一个典型场景是:向 webservice 发送请求,解析响应(
【问题讨论】:
-
您是否在数据流块内的 ForEach 期间向 UI 发送更新(以显示进度等)?如果是这样,您可以尝试仅每 250 毫秒调度一次 UI。以前做过,效果很好:)
-
我认为发布您的代码可以帮助确定您正在做的 CPU 与 IO 绑定工作量。
-
当你说“线程太多”时,你能给我们估计一下你运行了多少线程吗?是10吗? 100? 1000? 10000?
-
@Tom 只在一个数据流块完成后,相隔几秒以上,后台线程应该是独立的
-
@YuvalItzchakov 代码不实用,但我添加了一个线程执行的典型场景。
标签: c# wpf multithreading