如何在C#中持续检查CPU使用率?

时间:2014-06-23 16:35:56

标签: c# .net cpu-usage

我主要按照这个帖子的第二个答案中讨论的内容。我想运行一个程序,它将持续检查CPU使用率超过5%,持续10秒,并在每次发生时提醒我。

How to get the CPU Usage in C#?

我的代码如下:

static void Main(string[] args)
{
    Console.WriteLine("Checking for CPU usage");
    int totalhits = 0;
    float cpuPercent = getCPUValue();
    while (true)
    {
        if (cpuPercent >= 5)
        {
            totalhits += 1;
            if (totalhits == 10)
            {
                Console.WriteLine("Alert Usage has exceeded");
                Console.WriteLine("Press Enter to continue");
                Console.ReadLine();
                totalhits = 0;
            }
        }
        else
        {
            totalhits = 0;
        }
    }
}

private static float getCPUValue()
{
    PerformanceCounter cpuCounter = new PerformanceCounter();
    cpuCounter.CategoryName = "Processor";
    cpuCounter.CounterName = "% Processor time";
    cpuCounter.InstanceName = "_Total";

    float firstValue = cpuCounter.NextValue();
    System.Threading.Thread.Sleep(50);
    float secondValue = cpuCounter.NextValue();
    return secondValue;
}

我的问题是它永远不会达到那个阈值,如果我取出totalhits = 0;在最里面的if语句中的语句然后它在不到5秒的时间内达到阈值。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先

  

float cpuPercent = getCPUValue();

行应该在循环内部。否则,您只会读取一次CPU使用率。并将迭代相同的值。

您应该只创建一个PerformanceCounter对象,并在循环内反复调用cpuCounter.NextValue()。 不要在每次迭代中创建相同的CPU PerformanceCounter。

   PerformanceCounter counter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
   while (true)
   {
       float cpuPercent = counter.nextValue();
       if (cpuPercent >= 5)
       {
           totalhits += 1;
           if (totalhits == 10)
           {
               Console.WriteLine("Alert Usage has exceeded");
               Console.WriteLine("Press Enter to continue");
               Console.ReadLine();
               totalhits = 0;
           }
       }
       else
       {
           totalhits = 0;
       }
   }

MSDN

中所述
  

要获取需要初始值或上一个值来执行必要计算的计数器的性能数据,请调用NextValue方法两次,并使用您应用程序所需返回的信息。

所以你应该调用cpuCounter.NextValue()两次(调用之间有大约1秒的延迟)来开始获得正确的CPU使用率结果。

BTW,您应该在CPU PerformanceCounter的每次读取操作之间等待大约1秒钟(以确保更新)。

如此帖Retriving Accurate CPU Usate In C#

所示

答案 1 :(得分:0)

使用下面msdn中所述的 DispatcherTimer ,并根据需要获得结果。

DispatcherTimer