我想每 1 秒获得 CPU 使用率(所有核心)

I want to get CPU usage (all of core) every 1sec

首先,我从8个月前开始学习C#,我的英语不好。所以,如果我说了一些你无法理解的话,我很抱歉。

现在,我正在使用 C# 开发获得 CPU 使用百分比的应用程序。 我想每秒钟获得 CPU 所有核心的使用率。然后我使用了 PerformanceCounter Class 和 Processor Category。这是我写的代码。

    private void GetCpuUsageEvery1sec(object sender, ElapsedEventArgs e)
    {
        int getValue = 0;
        mProcessorCount = Environment.ProcessorCount;

        mPerformanceCounter.CategoryName = "Processor";
        mPerformanceCounter.CounterName = "% Processor Time";
        mPerformanceCounter.InstanceName = "_TOTAL";

        getValue = (int)Math.Truncate(mPerformanceCounter.NextValue());

        mProcessorCpuUsage[mProcessorCount] = getValue;   //I set TOTAL's usage in last of Array

        Console.WriteLine(DateTime.Now.ToString());
        Console.WriteLine("Core:TOTAL {0}%", mProcessorCpuUsage[mProcessorCount]);

        for (int count = 0; count < mProcessorCount; count++)
        {
            mPerformanceCounter.InstanceName = count.ToString();   //this code is case

            getValue = (int)Math.Truncate(mPerformanceCounter.NextValue());
            mProcessorCpuUsage[count] = getValue;
            Console.WriteLine("Core:{0} {1}%", count, mProcessorCpuUsage[count]);
        }

        Console.WriteLine();

    }

我也用定时器 Class 编写了方法,将 GetCpuUsageEvery1sec 方法作为事件启动。

但是,在处理器类别(或处理器时间计数器)中,如果我更改 InstanceName,此计数器将抛出 0。 因此,如果我使用 Timer Class.

执行方法,我不能只得到 0

我认为如果我想获得正确的 CPU 用法,我应该使实例的核心数相同。 (而且很多用户都会用到这个应用,所以我不能提前指定Core的数量。)

在这种情况下,我找不到其他解决方案吗?

我建议您使用 WMI 查询:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
            var cpuTimes = searcher.Get()
                .Cast<managementobject>()
                .Select(mo => new
                {
                    Name = mo["Name"],
                    Usage = mo["PercentProcessorTime"]
                }
                )
                .ToList();

用一个计时器连接这个,你会安定下来,最好对每个核心使用一个 for 循环。