2010-02-02 6 views
24
PerformanceCounter cpuload = new PerformanceCounter(); 
cpuload.CategoryName = "Processor"; 
cpuload.CounterName = "% Processor Time"; 
cpuload.InstanceName = "_Total"; 
Console.WriteLine(cpuload.NextValue() + "%"); 

Der Ausgang ist immer 0%, während der cpuload.RawValue ist wie 736861484375 oder so, was ist passiert bei NextValue()?Warum wies der CPU-Leistungszähler weiterhin 0% CPU-Auslastung auf?

Antwort

30

Die erste Iteration des Zählers he ist immer 0, weil sie nichts mit dem letzten Wert zu vergleichen hat. Versuchen Sie Folgendes:

var cpuload = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
Console.WriteLine(cpuload.NextValue() + "%"); 
Console.WriteLine(cpuload.NextValue() + "%"); 
Console.WriteLine(cpuload.NextValue() + "%"); 
Console.WriteLine(cpuload.NextValue() + "%"); 
Console.WriteLine(cpuload.NextValue() + "%"); 

Dann sollten Sie einige Daten kommen sehen. Es wurde gemacht, um in einem konstanten Graphen oder einem aktualisierten Szenario gesehen zu werden ... deshalb stößt man oft nicht auf dieses Problem.

Hier ist die MSDN reference:

Die Methode nextvalue() liefert immer einen 0-Wert beim ersten Anruf. So müssen Sie diese Methode eine zweite Zeit nennen.

13

Erste ersten Wert abrufen (würde 0 sein)

NextValue(); 

Dann wartet 1000 in ms

Thread.Sleep(1000); 

Dann zweiten Wert abrufen, die die wahre CPU-Auslastung ist.

NextValue(); 

Der Code sollte wie folgt aussehen:

float perfCounterValue = perfCounter.NextValue(); 

//Thread has to sleep for at least 1 sec for accurate value. 
System.Threading.Thread.Sleep(1000); 

perfCounterValue = perfCounter.NextValue(); 

Console.WriteLine("Value: {0}", perfCounterValue);