36
PerformanceCounter cpuload = new PerformanceCounter();
cpuload.CategoryName = "Processor";
cpuload.CounterName = "% Processor Time";
cpuload.InstanceName = "_Total";
Console.WriteLine(cpuload.NextValue() + "%");

输出始终为 0%,而cpuload.RawValue736861484375 左右,发生了NextValue()什么?

4

2 回答 2

50

计数器的第一次迭代将始终为 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 参考

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

于 2010-02-02T04:18:43.437 回答
24

首先检索第一个值(将是 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);
于 2011-01-17T09:02:54.650 回答