我已经发现this question告诉我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获得结果,而不必每个等待半秒钟。我是这样做的:
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毫秒并不是唯一的区别。
答案 0 :(得分:0)
我找到了原因 - 这是一个基本的.NET错误,与PerformanceCounters无关。如果我将一个对象(在本例中为PerformanceCounter)传递给方法并将其设置为对象的实例,则原始空引用不会更新为指向新对象。这意味着PerformanceCounter将继续为null。
解决方案是在调用方法之前实例化PerformanceCounter ......
遗憾的是,这个解决方案与所提问题的核心主题并不真正相关,但在提出这个问题时我并不知道。