我有一个应用程序,它从网络上获取大量信息并使用 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/