开发环境:

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占用高 简单优化相关推荐

  1. CocosCreator客户端优化系列(四):CPU占用及性能优化

    来自:https://blog.csdn.net/zzx023/article/details/88991314 CocosCreator客户端优化系列(四):CPU占用及性能优化 这篇文章是优化系列 ...

  2. 使用dlv分析golang进程cpu占用高问题

    c++通过dbg分析内存和cpu,可能大家都会.本篇主要分析通过delve分析golang程序cpu占用高的问题. delve是golang推荐的专门go语言调试工具,用来替代gdb.golang组织 ...

  3. cpu占用高 本地服务器,win10系统服务主机本地系统cpu占用高的解决方法

    很多小伙伴都遇到过win10系统服务主机本地系统cpu占用高的困惑吧,一些朋友看过网上零散的win10系统服务主机本地系统cpu占用高的处理方法,并没有完完全全明白win10系统服务主机本地系统cpu ...

  4. Wallpaper Engine卡顿,CPU占用高,独显没有被使用的解决方法

    Wallpaper Engine卡顿,CPU占用高,独显没有被使用的解决方法 1.独显设置 2.安装核显驱动 如果你的PC有独立显卡,但是WE桌面卡顿,用任务管理器查看发现CPU占用率高,独显没有被使 ...

  5. Mysql CPU占用高的问题解决方法小结

    Mysql CPU占用高的问题解决方法小结 参考文章: (1)Mysql CPU占用高的问题解决方法小结 (2)https://www.cnblogs.com/shuaiandjun/p/566204 ...

  6. SQLSERVER排查CPU占用高的情况

    今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库 ...

  7. java cpu 占用高问题定位

    解决过程: 1,根据top命令,发现PID为7137的Java进程占用CPU高达200%,出现故障. 2,找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序: 显示 ...

  8. 查询CPU占用高的SQL语句的解决方案

    触发器造成死锁.作业多且频繁.中间表的大量使用.游标的大量使用.索引的设计不合理.事务操作频繁.SQL语句设计不合理,都会造成查询效率低下.影响服务器性能的发挥.我们可以使用sql server自带的 ...

  9. java cpu高_Java中的CPU占用高和内存占用高的问题排查

    下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...

最新文章

  1. oracle mysql 乱码_解决Oracle数据库中文乱码
  2. Servlet简介与Servlet和HttpServlet运行的流程
  3. angular 路由页面不刷新
  4. LeetCode 16.01 交换两数
  5. B-JUI文档、下载
  6. 去调频体制下的 rd算法_【技术文章】一次调频工作原理及控制 学习1+1
  7. 迈向万亿市场的直播电商
  8. 在Linux下使用Vim编写C++
  9. STM32 Cortex-M3 NMI异常
  10. 3、数据库的事务、并发和锁机制
  11. php任意地方关闭弹窗,vue和jq中实现点击任意地方关闭弹窗
  12. 我国物联网发展如何跳出“窄巷”?
  13. 图书流通管理系统——软件开发项目实践
  14. Linux学习笔记——SecureCRT 8版本中文破解版
  15. Oracle基本知识点总结
  16. iOS 去除字符串中的H5标签
  17. 生成微信公众号二维码(动态,彩色)(python)
  18. OpenCV3的GPU模块编译
  19. 敏感词汇检测及返回敏感源词汇
  20. 比较不同利率下的贷款

热门文章

  1. vue input自动获取焦点的方法
  2. 华为 IS-IS中间系统数据包与邻居状态
  3. iOS 16 新 API 和功能
  4. MATLAB符号运算实现复变函数积分
  5. 华为HCNA之配置STELNET登陆实验
  6. 企业绩效管理的三大难点
  7. Linux命令之修改文件所属组chgrp
  8. pyqt5,Qchart画折线图,设定多个不同刻度的Y轴,修改自定义折线图的坐标轴,改变折线图的底色
  9. 批量导入html收藏夹谷歌,如何将360浏览器收藏夹导入谷歌浏览器书签?
  10. HTTP协议、URI和URL、报文首部