我有一个WPF应用程序,它使用几个后台线程来预编译LINQ查询并预先缓存一些稍后需要的值。TPL用于通过以下方式启动这些任务:
var newTask = new Task(taskAction, myCancelToken, TaskCreationOptions.LongRunning);
newTask.Start();然而,这些线程会导致很高的cpu负载,这在UI中是可以察觉的,只要线程没有完成,cpu负载就会变得笨拙甚至冻结。
那么,什么才是平滑UI的合理方法呢?通过研究,我发现,不应该给线程特殊的优先级。其他人的意思是,频繁使用Thread.Sleep()是一种方法,在我看来,这似乎有点过时和老生常谈。
有没有其他我不知道的方式?优先线程有真正的缺点吗(这不可能直接通过TPL,afaik)?
提前感谢!
发布于 2011-12-16 21:12:54
比方说在一台4核机器上,10个线程太多了。如果它们像预编译查询一样是计算受限的,那么它们都会争用cpu时间,并且会使整个机器失去响应。
我建议您使用Environment.ProcessorCount来找出有多少核可用,并且一次只启动(该数量为-1)个线程。您可以确定哪个工作最先运行,然后将其他工作作为延续进行排队。
这将留下一个免费的核心来服务您的UI线程,并应使应用程序再次响应。
发布于 2011-12-16 17:37:26
关于任务的优先级,你可以像http://blogs.microsoft.co.il/blogs/bnaya/archive/2011/01/29/how-to-schedule-task-on-different-thread-priority.aspx那样做smth
但是AFAIK显式更改线程优先级不是推荐的做法
https://stackoverflow.com/questions/8532068
复制相似问题