开发环境:

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. torch.roll
  2. 20天持续压测,告诉你云存储性能哪家更强?
  3. Java8学习之旅2---基于Lambda的JDBC编程
  4. 理解SSL必须要理解的密码技术
  5. DayDayUp:昨天用微信发朋友圈—发现微信出现一点点Bug记录
  6. Leetcode题库203.移除链表元素(尾指针填充 / 虚头指针定义 c实现)
  7. JedisConnectionException: java.Net.SocketTimeoutException: Read timed
  8. 随手刷屏的波士顿动力机器人,用3D打印解决了哪些问题
  9. 适合新手入门—嵌入式C语言
  10. MySQL中幻读是如何解决的
  11. pt-archiver归档数据 源库和目标库是否会出现不一致
  12. python去除重复单词_Python程序,用于删除给定句子中的所有重复单词。
  13. 直播APP开发需要具备哪些功能?
  14. 【转】Matlab坐标修改及旋转
  15. matlab 在2k屏幕,如何将4k显示器的分辨率调整为2k,并将2k分辨率用于4k显示器
  16. C语言标题下面程序用于输入三角形的三条边a,b,c,判断它们能否构成三角形,若能,则指出是何种三角形:等腰三角形、直角三角形、等腰直角三角形,一般三角形。若不能,则输出“不是三角形\n”
  17. electron解决下载慢(亲测有效)
  18. sqlserver update join 多关联更新
  19. quartz的schedulerFactory实现解析
  20. dll系统文件缺失修复工具-DirectX Repair

热门文章

  1. Android 代码精简 -- dimen抽取遇到的坑
  2. 【深度之眼吴恩达机器学习第四期】笔记(八)
  3. SHA算法的C++实现
  4. xshell免费版下载安装
  5. 12张图带你彻底搞懂服务限流、熔断、降级、雪崩
  6. SpringBoot+JdbcTemplate通用Mapper的实现
  7. 7-2 简单计算器 (25分)
  8. NumPy最详细入门笔记
  9. 《淘宝首页性能优化实践》文章阅读
  10. *** missing separator. Stop.