C# 多线程CPU占用高 简单优化
开发环境:
IDE:VS2022,
C#版本 >=.net4.0(4.0开始支持Task类)
内容:
有次做了一个20工位相互独立的上位机,使用Task类针对每个工位的流程单独开启一个线程,起初认为单个线程的任务处理完成,线程会自动释放,没有强制垃圾收集。
在二代I7CPU平台测试时,程序进程CPU占用最高50个线程左右(工位全部运行时,CPU总占用率一直维持在100%)这个线程数量和程序中明确使用的线程数量相仿,认为可能是CPU版本较低导致,随更换为9代I7CPU,经测试工位全部运行时,程序进程CPU线程数最高100左右,CPU总占用率仍然达到100%,随考虑优化线程使用,最终在线程结束时加了一个GC.Collect()解决问题。代码示例如下:
//有问题代码
任务1:
private void ReadStartTask()
{while(_IsRuning){for(int i=0;i<20;i++) //总共20个工位{if(ScanEnable[i]) //每个工位是否可以开始扫码,开始流程{Task.Factory.StartNew((obj) => {int n = (int)obj;StartScan(n);},i); //传入工位编号}}Thread.Sleep(10);}
}private void StartScan(int station)
{bool done =false;while(!done){switch(ScanFlow[station]) //不同工位进行处理{case ScanFlow.ScanSN:break;case ScanFlow.ScanEnd:done=true;break; }Thread.Sleep(100);}
}
//优化后代码
任务1:
private void ReadStartTask()
{while(_IsRuning){for(int i=0;i<20;i++) //总共20个工位{if(ScanEnable[i]) //每个工位是否可以开始扫码,开始流程{Task t=new Task((obj) => {int n = (int)obj;StartScan(n);},i); //传入工位编号t.ContinueWith(f=>{GC.Collect();});t.Start(); }}Thread.Sleep(10);}
}private void StartScan(int station)
{bool done =false;while(!done){switch(ScanFlow[station]) //不同工位进行处理{case ScanFlow.ScanSN:break;case ScanFlow.ScanEnd:done=true;break; }Thread.Sleep(100);}
}
C# 多线程CPU占用高 简单优化相关推荐
- CocosCreator客户端优化系列(四):CPU占用及性能优化
来自:https://blog.csdn.net/zzx023/article/details/88991314 CocosCreator客户端优化系列(四):CPU占用及性能优化 这篇文章是优化系列 ...
- 使用dlv分析golang进程cpu占用高问题
c++通过dbg分析内存和cpu,可能大家都会.本篇主要分析通过delve分析golang程序cpu占用高的问题. delve是golang推荐的专门go语言调试工具,用来替代gdb.golang组织 ...
- cpu占用高 本地服务器,win10系统服务主机本地系统cpu占用高的解决方法
很多小伙伴都遇到过win10系统服务主机本地系统cpu占用高的困惑吧,一些朋友看过网上零散的win10系统服务主机本地系统cpu占用高的处理方法,并没有完完全全明白win10系统服务主机本地系统cpu ...
- Wallpaper Engine卡顿,CPU占用高,独显没有被使用的解决方法
Wallpaper Engine卡顿,CPU占用高,独显没有被使用的解决方法 1.独显设置 2.安装核显驱动 如果你的PC有独立显卡,但是WE桌面卡顿,用任务管理器查看发现CPU占用率高,独显没有被使 ...
- Mysql CPU占用高的问题解决方法小结
Mysql CPU占用高的问题解决方法小结 参考文章: (1)Mysql CPU占用高的问题解决方法小结 (2)https://www.cnblogs.com/shuaiandjun/p/566204 ...
- SQLSERVER排查CPU占用高的情况
今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库 ...
- java cpu 占用高问题定位
解决过程: 1,根据top命令,发现PID为7137的Java进程占用CPU高达200%,出现故障. 2,找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序: 显示 ...
- 查询CPU占用高的SQL语句的解决方案
触发器造成死锁.作业多且频繁.中间表的大量使用.游标的大量使用.索引的设计不合理.事务操作频繁.SQL语句设计不合理,都会造成查询效率低下.影响服务器性能的发挥.我们可以使用sql server自带的 ...
- java cpu高_Java中的CPU占用高和内存占用高的问题排查
下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...
最新文章
- oracle mysql 乱码_解决Oracle数据库中文乱码
- Servlet简介与Servlet和HttpServlet运行的流程
- angular 路由页面不刷新
- LeetCode 16.01 交换两数
- B-JUI文档、下载
- 去调频体制下的 rd算法_【技术文章】一次调频工作原理及控制 学习1+1
- 迈向万亿市场的直播电商
- 在Linux下使用Vim编写C++
- STM32 Cortex-M3 NMI异常
- 3、数据库的事务、并发和锁机制
- php任意地方关闭弹窗,vue和jq中实现点击任意地方关闭弹窗
- 我国物联网发展如何跳出“窄巷”?
- 图书流通管理系统——软件开发项目实践
- Linux学习笔记——SecureCRT 8版本中文破解版
- Oracle基本知识点总结
- iOS 去除字符串中的H5标签
- 生成微信公众号二维码(动态,彩色)(python)
- OpenCV3的GPU模块编译
- 敏感词汇检测及返回敏感源词汇
- 比较不同利率下的贷款