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

smw*_*dia 31 c# performancecounter cpu-usage

PerformanceCounter cpuload = new PerformanceCounter();
cpuload.CategoryName = "Processor";
cpuload.CounterName = "% Processor Time";
cpuload.InstanceName = "_Total";
Console.WriteLine(cpuload.NextValue() + "%");
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ver 42

计数器的第一次迭代将始终为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() + "%");
Run Code Online (Sandbox Code Playgroud)

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

这是MSDN参考:

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


小智 20

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

NextValue();
Run Code Online (Sandbox Code Playgroud)

然后等待1000 milisec

Thread.Sleep(1000);
Run Code Online (Sandbox Code Playgroud)

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

NextValue();
Run Code Online (Sandbox Code Playgroud)

代码应该如下所示:

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);
Run Code Online (Sandbox Code Playgroud)