2013-05-16 41 views
0

我已經找到this question告訴我的PerformanceCounter第一次出現的是0時總是返回0,所以我不得不多次調用它來獲得正確的結果。爲什麼我的PerformanceCounter路過櫃檯的方法

我,要很好地工作 - 它看起來像這樣:

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

我找到了原因 - 這是一個基本的.NET錯誤,與PerformanceCounters無關。如果我將一個對象(在這種情況下是PerformanceCounter)傳遞給方法並將其設置爲對象的實例,則原始空引用不會更新爲指向新對象。這意味着PerformanceCounter將繼續爲空。

解決方法是調用該方法之前實例化的PerformanceCounter ...

該解決方案,不幸的是,是不是要問的問題的核心話題真正相關的,但我不知道當時問它。