c# – 重型TPL后台线程在WPF的UI-Thread中产生滞后

我有一个 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线程提供服务,并且应该让应用程序再次响应.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...