【问题标题】:I want to get CPU usage (all of core) every 1sec我想每 1 秒获取一次 CPU 使用率(所有核心)
【发布时间】:2018-10-15 03:02:18
【问题描述】:

首先,我从 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();

    }

我编写了带有 Timer 类的方法,它也将 GetCpuUsageEvery1sec 方法作为事件启动。

但是,在处理器类别(或处理器时间计数器)中,如果我更改 InstanceName,此计数器会抛出 0。 因此,如果我使用 Timer 类执行方法,我不能只得到 0。

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

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

【问题讨论】:

  • Mr.Dennis Kuypers 谢谢您的建议!我忽略了那个内容。但如果可能的话,我不想使用很多实例。例如,我使用 wmi。
  • 我不想使用很多实例,因为应用程序用户可能有很多很多内核。如果我得到你的任何建议,我会很高兴的。

标签: c# cpu-usage performancecounter


【解决方案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 循环。

【讨论】:

  • Mr.Garr J 谢谢你的建议!!这真的是我想要的代码!我测试了这段代码,我知道它对我有用。我可以再问你一个问题吗?我认为“PercentProcessorTime”与此代码相同(来自我的主要问题),这种想法正确吗? mPerformanceCounter.CategoryName = "处理器"; mPerformanceCounter.CounterName = "% 处理器时间";
  • 我认为你是对的,但它应该通过测试。
  • 我很乐意提供帮助!
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 2021-06-13
  • 1970-01-01
  • 2016-08-19
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多