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

时间:2018-10-15 03:02:19

标签: c# cpu-usage performancecounter

首先,我从8个月前开始学习C#,而且我不会英语。因此,对不起您说不明白的话。

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

    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();

    }

我还编写了带有计时器类的方法,该方法也将GetCpuUsageEvery1sec方法启动为事件。

但是,在“处理器”类别(或“处理器时间计数器”)中,如果我更改InstanceName,则此计数器抛出0。 因此,如果我使用计时器类来执行方法,我将不会仅获得0。

我认为,如果我想获得正确的CPU使用率,则应该使实例数与Core数相同。 (而且许多用户将使用此应用程序。因此,我无法提前指定Core的数量。)

在这种情况下,我无法获得其他解决方案?

1 个答案:

答案 0 :(得分:1)

我建议您使用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循环会更好。