我已经发现这个问题告诉我 PerformanceCounter 的第一次出现是 0,所以我必须多次调用它才能得到正确的结果。
我让它工作正常 - 它看起来像这样:
public static float GetCpuUsage()
{
var cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
// Prime it
cpuCounter.NextValue();
Thread.Sleep(500);
return cpuCounter.NextValue();
}
但是,我希望能够从多个 PerformanceCounter 中获得结果,而不必为每个 PerformanceCounter 等待半秒。我是这样做的:
public static float GetCpuUsage(PerformanceCounter counter)
{
if (counter == null)
{
counter = new PerformanceCounter();
counter.CategoryName = "Processor";
counter.CounterName = "% Processor Time";
counter.InstanceName = "_Total";
}
return counter.NextValue();
}
我这样称呼它:
PerformanceCounter cpuCounter = null;
PerformanceCounter memoryCounter = null;
while (_isRunning)
{
result.Cpu = GetCpuUsage(cpuCounter);
result.Memory = GetAvailableMemory(memoryCounter);
// Process result
Thread.Sleep(500);
}
我认为这是一个非常好的主意——每次都将相同的计数器实例传递给方法。
但是,它实际上不起作用,cpu始终为0。
它告诉我有一些关于 PerformanceCounters 的基本知识我不了解(并且在我链接的问题中没有解决)。
究竟是什么使 PerformanceCounter 起作用?因为似乎在每次 NextValue 调用之间等待 500 毫秒并不是唯一的区别。