Wie bekomme ich die CPU-Auslastung in C #?

Ich möchte die gesamte CPU-Gesamtauslastung für eine Anwendung in C # ermitteln. Ich habe viele Möglichkeiten gefunden, in die Eigenschaften von processen einzudringen, aber ich möchte nur die CPU-Auslastung der processe und die Gesamt-CPU, wie Sie sie im TaskManager erhalten.

Wie mache ich das?

Solutions Collecting From Web of "Wie bekomme ich die CPU-Auslastung in C #?"

Sie können die PerformanceCounter- class von System.Diagnostics verwenden .

Initialisiere so:

PerformanceCounter cpuCounter; PerformanceCounter ramCounter; cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); ramCounter = new PerformanceCounter("Memory", "Available MBytes"); 

Konsumiere so:

 public string getCurrentCpuUsage(){ return cpuCounter.NextValue()+"%"; } public string getAvailableRAM(){ return ramCounter.NextValue()+"MB"; } 

Ein wenig mehr als erforderlich, aber ich benutze den zusätzlichen Timer-Code, um zu verfolgen und warnt, wenn die CPU-Auslastung für eine Dauer von 1 Minute oder länger 90% oder höher ist.

 public class Form1 { int totalHits = 0; public object getCPUCounter() { PerformanceCounter cpuCounter = new PerformanceCounter(); cpuCounter.CategoryName = "Processor"; cpuCounter.CounterName = "% Processor Time"; cpuCounter.InstanceName = "_Total"; // will always start at 0 dynamic firstValue = cpuCounter.NextValue(); System.Threading.Thread.Sleep(1000); // now matches task manager reading dynamic secondValue = cpuCounter.NextValue(); return secondValue; } private void Timer1_Tick(Object sender, EventArgs e) { int cpuPercent = getCPUCounter(); if (cpuPercent >= 90) { totalHits = totalHits + 1; if (totalHits == 60) { Interaction.MsgBox("ALERT 90% usage for 1 minute"); totalHits = 0; } } else { totalHits = 0; } Label1.Text = cpuPercent + " % CPU"; Label2.Text = getRAMCounter() + " RAM Free"; Label3.Text = totalHits + " seconds over 20% usage"; } } 

Nachdem ich einige Zeit damit verbracht habe, ein paar verschiedene Themen zu lesen, die ziemlich kompliziert erschienen, kam ich auf diese Idee. Ich brauchte es für eine 8-core-Maschine, wo ich SQL Server überwachen wollte. Für den Code unten habe ich dann “sqlservr” als appName übergeben.

 private static void RunTest(string appName) { bool done = false; PerformanceCounter total_cpu = new PerformanceCounter("Process", "% Processor Time", "_Total"); PerformanceCounter process_cpu = new PerformanceCounter("Process", "% Processor Time", appName); while (!done) { float t = total_cpu.NextValue(); float p = process_cpu.NextValue(); Console.WriteLine(String.Format("_Total = {0} App = {1} {2}%\n", t, p, p / t * 100)); System.Threading.Thread.Sleep(1000); } } 

Es scheint korrekt zu messen, wie viel Prozent der CPU von SQL auf meinem 8-Core-Server verwendet wird.

Es ist OK, ich habe es! Danke für Ihre Hilfe!

Hier ist der Code, um es zu tun:

 private void button1_Click(object sender, EventArgs e) { selectedServer = "JS000943"; listBox1.Items.Add(GetProcessorIdleTime(selectedServer).ToString()); } private static int GetProcessorIdleTime(string selectedServer) { try { var searcher = new ManagementObjectSearcher (@"\\"+ selectedServer +@"\root\CIMV2", "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name=\"_Total\""); ManagementObjectCollection collection = searcher.Get(); ManagementObject queryObj = collection.Cast().First(); return Convert.ToInt32(queryObj["PercentIdleTime"]); } catch (ManagementException e) { MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); } return -1; } 

Sie können WMI verwenden, um CPU-Prozentinformationen abzurufen. Sie können sich sogar an einem Remotecomputer anmelden, wenn Sie über die richtigen Berechtigungen verfügen. Sehen Sie sich http://www.csharphelp.com/archives2/archive334.html an, um eine Vorstellung davon zu bekommen, was Sie erreichen können.

Hilfreich könnte auch die MSDN-Referenz für den Win32_Process- Namespace sein.

Siehe auch ein CodeProject-Beispiel. Vorgehensweise : (Fast) Alles in WMI über C # .

CMS hat es richtig, aber auch wenn Sie den Server-Explorer im Visual Studio verwenden und mit dem Performance Counter-Tab spielen, können Sie herausfinden, wie Sie viele nützliche Messwerte erhalten.

Dies scheint für mich zu funktionieren, ein Beispiel für das Warten, bis der processor einen bestimmten Prozentsatz erreicht

 var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); int usage = (int) cpuCounter.NextValue(); while (usage == 0 || usage > 80) { Thread.Sleep(250); usage = (int)cpuCounter.NextValue(); } 

Ich mochte es nicht, den 1-Sekunden-Stand zu allen PerformanceCounter Lösungen hinzuzufügen. Stattdessen entschied ich mich für eine WMI Lösung. Der Grund für die 1-Sekunden-Wartezeit / Abwürgung besteht darin, dass der Messwert korrekt ist, wenn ein PerformanceCounter . Wenn Sie diese Methode jedoch häufig aufrufen und diese Informationen aktualisieren, rate ich Ihnen, diese Verzögerung nicht ständig in Kauf zu nehmen … selbst wenn Sie daran denken, einen asynchronen process durchzuführen, um sie zu erhalten.

Ich begann mit dem Snippet von hier Zurück zur CPU-Nutzung in WMI mit C # und fügte eine vollständige Erklärung der Lösung in meinem Blog-Post unten:

CPU-Auslastung über alle coree in C # mithilfe von WMI abrufen

Diese class fragt den Zähler automatisch alle 1 Sekunden ab und ist außerdem Thread-sicher:

 public class ProcessorUsage { const float sampleFrequencyMillis = 1000; protected object syncLock = new object(); protected PerformanceCounter counter; protected float lastSample; protected DateTime lastSampleTime; ///  /// ///  public ProcessorUsage() { this.counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true); } ///  /// ///  ///  public float GetCurrentValue() { if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis) { lock (syncLock) { if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis) { lastSample = counter.NextValue(); lastSampleTime = DateTime.UtcNow; } } } return lastSample; } }