0

我已经发现这个问题告诉我 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 毫秒并不是唯一的区别。

4

1 回答 1

0

我找到了原因——这是一个基本的 .NET 错误,与 PerformanceCounters 无关。如果我将一个为 null 的对象(在本例中为 PerformanceCounter)传递给一个方法并将其设置为一个对象的实例,则原始的 null 引用不会更新为指向新对象。这意味着 PerformanceCounter 将继续为空。

解决方案是在调用方法之前实例化 PerformanceCounter...

不幸的是,这个解决方案与所提出问题的核心主题并不真正相关,但我在提出问题时并不知道这一点。

于 2013-05-16T21:30:14.703 回答