2013-08-23 13 views
10

Ich möchte in meinem Projekt aktuelle CPU-Auslastung habenerhalten aktuelle CPU-Auslastung in C#

namespace Monitoring_Tool 
{ 
    public partial class ajaxExecute : System.Web.UI.Page 
    { 
     private PerformanceCounter theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
     private PerformanceCounter theMemCounter = new PerformanceCounter("Memory", "Available MBytes"); 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      float cpuUsage = 0.00F; 

      cpuUsage = this.theCPUCounter.NextValue(); 
     } 
    } 
} 

Wenn ich mein Projekt zu debuggen, wird der Wert in cpuUsage0.00 zeigt aber, wenn ich QuickWatch auf this.theCPUCounter.NextValue(); tun, ist es zeigt 20.6786852 .

Warum kann ich es nicht in einer Variablen speichern?

+2

Dumme Bemerkung, aber vielleicht hast du die Anweisung beim Debuggen noch nicht übersprungen, also ist der neue Wert noch nicht in der Variablen 'cpuUsage' gespeichert? – Mr47

Antwort

9

Das ist, weil Sie NextValue mehrmals auf der gleichen PerformanceCounter Instanz aufrufen müssen (also mindestens zweimal). Der erste Anruf wird immer wieder zurückkehren 0.

Sie können NextValue Handler zweimal in Ihrem Page_Load Ereignis aufrufen (Art) dieses Problem umgehen, nur den Rückgabewert des zweiten Anruf zu speichern:

 float cpuUsage = 0.00F; 

     this.theCPUCounter.NextValue(); 
     cpuUsage = this.theCPUCounter.NextValue(); 

Der Grund Das zeigt in der QuickWatch des Debuggers wohl nur, weil es (implizit) mehrfach aufgerufen wird (einmal vom Programm und einmal vom Debugger für den QuickWatch-Wert).

Update auf die „Art“ oben:

Wie andere erwähnt haben Sie in der Regel einige Zeit zwischen den beiden Anrufen muss schlafen, um tatsächlich einen Unterschied in der CPU-Last zu beobachten, die in einer „messbaren“ Differenz resultiert. Sleeping für 1 s ist in der Regel der Trick, aber möglicherweise keine akzeptable Verzögerung beim Laden Ihrer Seite.

Was Sie wirklich tun möchten, ist ein Hintergrund-Thread, der wiederholt diesen Leistungsindikator abfragt und ein paar Sekunden dazwischen schläft. Und das Ergebnis irgendwo speichern. Fragen Sie von Ihrer Page_Load oder anderen Ereignissen/Funktionen den (letzten) Wert ab. Natürlich mit allen notwendigen Sperren gegen Datenrennen. Es wird so genau sein, wie Sie in Bezug auf diesen Zeiger bekommen können.

Da Sie offensichtlich ASP.NET verwenden, müssen Sie vorsichtig mit solchen Hintergrund Threads sein. Ich bin kein ASP.NET-Experte, aber laut this sollte es möglich sein, obwohl der Thread (und die Perf-Zähler-Lesungen, die es getan hat) wiederverwendet wird, wenn Ihre App-Domain/Web-Anwendung ist. Für diese Art von Funktionalität sollte das jedoch kein Problem sein.

+1

"Der erste Anruf wird immer 0 zurückgeben." Gibt es einen Grund dafür? – sab669

+0

@ sab669 Per ['Dokumentation'] (https://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.nextvalue.aspx):" Wenn der berechnete Wert eines Zählers von zwei Zählern abhängt liest, gibt die erste Leseoperation 0.0 "zurück. Die "% Prozessorzeit" -Zähler benötigen den Status, um Ihnen eine Antwort zu geben, und der erste Aufruf an sie hat keinen Status, mit dem verglichen werden kann, so dass sie 0 zurückgeben. Weitere Informationen [hier] (http://stackoverflow.com/a/18399097/5095502). – Quantic

9

Es ist ein Leistungsindikator, der stark von abhängt, wenn Sie es lesen. Ein Prozessorkern führt entweder einen Code aus, der Vollbohrung bei "100%" ausführt. Oder es wird komplett ausgeschaltet, gestoppt von der HALT-Anweisung. Der "% Prozessorzeit" -Zähler teilt Ihnen mit, für wie viele% der Zeit, , seit der letzten Überprüfung Code ausgeführt wurde.

Sie erhalten also nur dann aussagekräftige Werte, wenn Sie lange genug warten, bis Sie sie abgetastet haben. Eine Sekunde ist der Text, den Sie in Perfmon.exe und Taskmgr.exe sehen. Je kürzer das Intervall ist, desto ungenauer wird die Anzahl. Es beginnt wild zu variieren und springt zwischen 0 und 100%.

Wenn Sie also 0% im Load-Ereignis der Seite erhalten, wird nur der Zähler initialisiert, um den Beginn des Intervalls festzulegen. Das nächste Sample zu bekommen, ist Härte, Sie können dies realistisch im Ereignishandler nicht tun. Sie müssten etwas drastisches tun, als hätten Sie einen separaten Timer oder Thread, der in Intervallen von einer Sekunde abtastet und diesen Wert verwendet.

Verwandte Themen