c# - 线程过多 - 影响渲染性能

标签 c# wpf multithreading

我有一个应用程序,它从网络上获取大量信息并使用 WPF 将其显示在窗口中。信息获取当然是在几个后台线程中完成的;它们中的大多数不应该是计算密集型的(除了一些文本解析之外),而主要依赖于获取网页内容(webclient.Download ..和类似的)。

由于我必须发送大量请求,因此我启动了很多线程,否则用户将不得不等待几个小时才能完成所有内容的加载;由于其中许多线程主要等待来自网络的数据和/或启动对 Web 服务的新请求,因此理论上这不应该是问题。然而,在实践中,调度程序的性能通常明显比没有线程运行时要差。

后台线程是由 TPL 数据流管道和 Parallel.ForEach 方法混合创建的。我也已经尝试通过指定 MaxThreads 来限制线程数量,但由于任何数据流 block 都可以启动 Parallel.Foreach block ,因此我认为这效果不太好。

有什么方法可以提高调度程序的优先级、性能或以其他方式减少口吃吗?

编辑:任务/线程的数量通常在 50-100 之间,在最坏的情况下可能会更多一些。 Weblookup 的典型场景是:向 Web 服务发送请求,解析响应(<10kb 字符串)。对于每个响应,(parallel.foreach) 下载该响应的数据,下载/缓存响应中的任何图像并解析响应(例如,删除维基百科文章中的任何链接);等待它们全部完成并移至下一个查找。

最佳答案

不要启动新线程来下载数据,请考虑使用下载函数的异步版本,例如 WebClient.DownloadDataTaskAsync。那么你就不需要启动线程了。只需调用

var result = await webClient.DownloadDataTaskAsync

并在await之后处理结果。这基本上将启动下载操作并返回。下载完成后,将执行该方法的其余部分。最重要的是它不使用任何额外的线程。

关于c# - 线程过多 - 影响渲染性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824857/

相关文章:

wpf - WPF应用程序开始最大化,但屏幕分辨率与显示不匹配

ios - NSCoreData 条目获取的性能

javascript - 访问异步函数之外的变量时的JS安全性

c# - Xamarin iOS 依赖服务始终在 iOS 应用程序中返回 null 对象

c# - 动态传递对象列表作为参数

c# - Json 反序列化 C#

c# - wpf 绑定(bind)不更新

wpf - 防止网格中的控件更改其列宽

c# - 我如何处理 StructureMap 的 ObjectFactory 中的每个实例对象?

c++ - 警告 : wint to poiter cast