c# hitzacker CPU-Auslastung steuern




heins haustechnik hitzacker (2)

Wie ist es ratsam, die CPU-Auslastung während der Laufzeit zu steuern?

Abfragen der CPU-Last und Einfügen von Schlaf?


Ich würde OS-Funktionalität empfehlen. Dafür gibt es unter Windows Leistungsindikatoren und WinAPI-Funktionen.

Hier ein Beispiel mit Leistungsindikatoren von BCL Team Blog :

foreach (Process proc in Process.GetProcesses()) {
    using (PerformanceCounter pcProcess = new PerformanceCounter("Process", "% Processor Time", proc.ProcessName)) {
        pcProcess.NextValue();
        System.Threading.Thread.Sleep(1000);
        Console.WriteLine("Process:{0} CPU% {1}", proc.ProcessName, pcProcess.NextValue());   
    }
}

Dieser Code macht dasselbe mit WMI von CodeProject :

public string GetCPU()
{
    decimal PercentProcessorTime=0;
    mObject_CPU.Get();

    ulong  u_newCPU   = 
      (ulong)mObject_CPU.Properties["PercentProcessorTime"].Value;
    ulong u_newNano   = 
      (ulong)mObject_CPU.Properties["TimeStamp_Sys100NS"].Value;
    decimal d_newCPU  = Convert.ToDecimal(u_newCPU);
    decimal d_newNano = Convert.ToDecimal(u_newNano);
    decimal d_oldCPU  = Convert.ToDecimal(u_oldCPU);
    decimal d_oldNano = Convert.ToDecimal(u_oldNano);

    // Thanks to MSDN for giving me this formula !

    PercentProcessorTime = 
      (1 - ((d_newCPU-d_oldCPU)/(d_newNano - d_oldNano)))*100m;

    // Save the values for the next run

    u_oldCPU          = u_newCPU;
    u_oldNano         = u_newNano;

    return PercentProcessorTime.ToString("N",nfi);;
}

So können Sie diese OS-Provider (oder andere für Ihr Betriebssystem) abfragen und Ihren Thread unterbringen, wenn die Prozessorauslastung hoch ist.


Der einfachste Weg wäre, Ihre Hauptschleife so zu modifizieren, dass Sie entweder auf die Eingabe warten - das klassische ereignisgesteuerte Modell - oder periodisch für eine kurze Zeit zu schlafen.

Wenn ich die Anwendung in den Ruhezustand versetzen würde, würde ich nur eine sehr kurze Zeitüberschreitung verwenden, irgendwo im Bereich von 10-100 ms, und einige Benutzereingaben würden sich verzögern, und weniger würde mehr OS-Overhead beim Umschalten Ihrer Anwendung mit sich bringen.