繁重的TPL后台线程在WPF的UI-Thread中产生滞后

时间:2011-12-16 09:21:20

标签: c# .net wpf multithreading task-parallel-library

我有一个WPF应用程序,它使用几个后台线程来预编译LINQ查询并预先缓存一些值,这些将在以后需要。 TPL用于通过以下方式启动这些任务:

var newTask = new Task(taskAction, myCancelToken, TaskCreationOptions.LongRunning);
newTask.Start();

这很有效,任务分布在几个cpu核心等上。但是,这些线程会导致高CPU负载,这在UI中是可感知的,只要线程没有完成,它就容易绊倒甚至冻结。

那么,什么是平滑UI的合理方法。通过研究我发现,那个人不应该给线程特别优先。其他人的意思是,频繁使用Thread.Sleep()是可行的方式,这对我来说似乎有点过时了。

还有其他方法我不知道吗?是否存在优先线程的真正缺点(直接通过TPL无法实现)?

提前致谢!

2 个答案:

答案 0 :(得分:1)

关于任务的优先顺序,你可以做得像 http://blogs.microsoft.co.il/blogs/bnaya/archive/2011/01/29/how-to-schedule-task-on-different-thread-priority.aspx

但不推荐AFAIK明确更改线程优先级

答案 1 :(得分:0)

一个4核机器上有10个线程太多了。如果它们像预编译查询一样受计算限制,那么它们都会争用cpu时间并且会使整个机器无响应。

我建议您使用Environment.ProcessorCount来查找可用的内核数量,并且一次只启动(那个数字 - 1)个线程。您可以优先考虑先运行哪些工作,然后将其他工作排成连续。

这将使核心免费为您的UI线程提供服务,并且应该让应用程序再次响应。