首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >繁重的TPL后台线程在WPF的UI-Thread中产生滞后

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

Stack Overflow用户
提问于 2011-12-16 17:21:20
回答 2查看 1.1K关注 0票数 4

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

代码语言:javascript
复制
var newTask = new Task(taskAction, myCancelToken, TaskCreationOptions.LongRunning);
newTask.Start();

然而,这些线程会导致很高的cpu负载,这在UI中是可以察觉的,只要线程没有完成,cpu负载就会变得笨拙甚至冻结。

那么,什么才是平滑UI的合理方法呢?通过研究,我发现,不应该给线程特殊的优先级。其他人的意思是,频繁使用Thread.Sleep()是一种方法,在我看来,这似乎有点过时和老生常谈。

有没有其他我不知道的方式?优先线程有真正的缺点吗(这不可能直接通过TPL,afaik)?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-16 21:12:54

比方说在一台4核机器上,10个线程太多了。如果它们像预编译查询一样是计算受限的,那么它们都会争用cpu时间,并且会使整个机器失去响应。

我建议您使用Environment.ProcessorCount来找出有多少核可用,并且一次只启动(该数量为-1)个线程。您可以确定哪个工作最先运行,然后将其他工作作为延续进行排队。

这将留下一个免费的核心来服务您的UI线程,并应使应用程序再次响应。

票数 0
EN

Stack Overflow用户

发布于 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显式更改线程优先级不是推荐的做法

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8532068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档