2011-12-16 20 views
4

我有一个WPF应用程序,它使用几个后台线程来预编译LINQ查询并预先存储一些值,稍后将需要。 TPL被使用来启动这些任务:沉重的TPL后台线程在WPF的用户界面线程产生滞后

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

这工作,任务分布在几个CPU内核等。但是,这些线程会导致高CPU负载,那就是在用户界面,这往往绊倒察觉甚至冻结,只要线程没有完成。

那么,什么可能是一个合理的方式来平滑UI。通过研究发现,那个人不应该给线程特别的优先权。其他人的意思是,经常使用Thread.Sleep()是要走的路,这对我来说似乎有点陈腐和诡诈。

有没有额外的方式我不知道?线程优化是否存在真正的缺点(这不可能通过TPL直接实现,afaik)?

在此先感谢!

+1

`TaskCreationOptions.LongRunning`创建新线程而不是使用线程池。你开始多少个线程,你的目标机器有多少个核心? – 2011-12-16 09:38:21

+0

我开始约十或十二个任务。 LongRunning模式只是一个尝试,我没有开始,并有相同的结果。核心数量可能不同,因为没有特殊的专用目标系统设置。 – 2011-12-16 10:56:35

回答

0

10个线程是在说一个4核的机器太多了。如果它们像预编译查询那样受计算限制,则它们都将争夺cpu时间并使整个机器无响应。

我建议你使用Environment.ProcessorCount找出有多少个核心可用,并且一次只启动(那个数字-1)线程。您可以优先考虑哪些工作首先运行,并将其他工作排列为延续。

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

1

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

但不建议线程的优先级的AFAIK明确改变做法

+1

我读过关于不推荐更改线程优先级的内容。但是,为什么,因为这是真的可能?那么,这是否意味着,如果有很多背景工作要做,我只能忍受一个表现不佳的UI? – 2011-12-16 10:59:05