为什么cpu性能计数器保持报告0%cpu使用率?

问题描述 投票:30回答:2
PerformanceCounter cpuload = new PerformanceCounter();
cpuload.CategoryName = "Processor";
cpuload.CounterName = "% Processor Time";
cpuload.InstanceName = "_Total";
Console.WriteLine(cpuload.NextValue() + "%");

输出总是0%,而cpuload.RawValue就像736861484375左右,NextValue()发生了什么?

c# cpu-usage performancecounter
2个回答
41
投票

计数器的第一次迭代将始终为0,因为它无法与最后一个值进行比较。试试这个:

var cpuload = new PerformanceCounter("Processor", "% Processor Time", "_Total");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");

然后你会看到一些数据出来。它是在一个不变的图表或更新的场景中看到的...这就是为什么你不经常遇到这个问题。

这是MSDN reference

方法nextValue()始终在第一次调用时返回0值。所以你必须再次调用这个方法。


20
投票

首先检索第一个值(将为0)

NextValue();

然后等待1000毫秒

Thread.Sleep(1000);

然后检索第二个值,这是真正的CPU使用率。

NextValue();

代码应该如下所示:

float perfCounterValue = perfCounter.NextValue();

//Thread has to sleep for at least 1 sec for accurate value.
System.Threading.Thread.Sleep(1000);

perfCounterValue = perfCounter.NextValue();

Console.WriteLine("Value: {0}", perfCounterValue);
© www.soinside.com 2019 - 2024. All rights reserved.