为什么我的PerformanceCounter在将计数器传递给方法时总是返回0

时间:2013-05-16 21:22:54

标签: c# performancecounter

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

1 个答案:

答案 0 :(得分:0)

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

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

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