前言

我们开发的上位机软件经常会遇到卡顿的情况,卡顿的原因很多种,有一种就是电脑的CPU利用率达到了100%,所以监控CPU的利用率能够有效的判断上位机软件卡顿是否由CPU负荷过重导致,CPU负荷过重一般发生在死循环、线程无延时、线程太多等场景。

常规方法监控CPU

常规监控CPU利用率的方法是使用windows任务管理器来监控,如下图:
在这里插入图片描述
任务管理器的“性能”一栏可以看到CPU的利用率,上图就是14%,但是这种方法的缺点就是当我们软件发生卡顿的时候没办法自动记录当时的CPU状况,这就给排查问题提高了难度,如果我们能在代码中实时监控CPU的状况,并将CPU利用率写入到本地日志,当软件发生卡顿的时候根据时间点和本地日志就可以判断当时的CPU情况,从而判断出上位机软件的卡顿是不是由CPU利用率过高导致的。

代码实时监控CPU

下面代码中通过PerformanceCounter类来获取可用CPU利用率;如果CPU达到100%,软件很容易卡顿。

 public partial class Form1 : Form
    {
        private PerformanceCounter cpuCounter;
        public Form1()
        {
            InitializeComponent();
            cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
            cpuCounter.NextValue();


            Task.Run(Run);
        }

        private void Run()
        {
            while (true)
            {
                CpuInfo cpuInfo = GetCpuInfo(out bool result,out string errorMsg);
                this.Invoke(new Action(()=>{ label1.Text = cpuInfo.ToString(); }));
                Thread.Sleep(3000);
            }
        }


        /// <summary>
        /// 获取cpu利用率
        /// </summary>
        /// <param name="result"></param>
        /// <param name="errorMsg"></param>
        /// <returns></returns>
        public CpuInfo GetCpuInfo(out bool result, out string errorMsg)
        {
            result = false;
            errorMsg = string.Empty;
            try
            {
                float cpuUsage = cpuCounter.NextValue();
                result = true;
                return new CpuInfo
                {
                    UsagePercentage = cpuUsage,
                    ProcessorCount = Environment.ProcessorCount
                };
            }
            catch (Exception ex)
            {
                errorMsg = ex.Message + ex.StackTrace;
                return null;
            }
        }
    }
    public class CpuInfo
    {
        public float UsagePercentage { get; set; }
        public int ProcessorCount { get; set; }

        public override string ToString()
        {
            return $"CPU使用率: {UsagePercentage:F2}% | 处理器数量: {ProcessorCount}";
        }
    }

运行效果

在这里插入图片描述

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》

公告

已订阅专栏或学习交流C#,请加文章最下方的qq群。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐