c# – 重型TPL后台线程在WPF的UI-Thread中产生滞后
发布时间:2020-12-15 21:27:29 所属栏目:百科 来源:网络整理
导读:我有一个 WPF应用程序,它使用几个后台线程来预编译LINQ查询并预先缓存一些值,这些将在以后需要. TPL用于通过以下方式启动这些任务: var newTask = new Task(taskAction,myCancelToken,TaskCreationOptions.LongRunning);newTask.Start(); 这样工作,任务分布
我有一个
WPF应用程序,它使用几个后台线程来预编译LINQ查询并预先缓存一些值,这些将在以后需要. TPL用于通过以下方式启动这些任务:
var newTask = new Task(taskAction,myCancelToken,TaskCreationOptions.LongRunning); newTask.Start(); 这样工作,任务分布在几个cpu核心等上.但是,这些线程会导致高CPU负载,这在UI中是可感知的,只要线程没有完成,它就容易绊倒甚至冻结. 那么,什么是平滑UI的合理方法.通过研究我发现,那个人不应该给线程特别优先.其他人的意思是,频繁使用Thread.Sleep()是要走的路,这对我来说似乎有点过时了. 还有其他我不知道的方法吗?是否存在优先级线程的真正缺点(直接通过TPL不能实现,afaik)? 提前致谢! 解决方法
比如说4核机器上有10个线程太多了.如果它们像预编译查询一样受计算限制,那么它们都会争用cpu时间并且会使整个机器无响应.
我建议你使用Environment.ProcessorCount来查找可用的内核数量,并且一次只启动(那个数字 – 1)个线程.您可以优先处理先运行的工作,并将其他工作排入连续. 这将使核心免费为您的UI线程提供服务,并且应该让应用程序再次响应. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |