Hallo, dieser eigentlich triviale Code soll die CPU Auslastung in eine Textdatei schreiben. Geschrieben wird die Datei, aber die CPU Auslastung ist immer bei 0 %, auch dann, wenn ich CPU lastige Games spiele. Was stimmt an diesem Code nicht?
using System;
using System.IO;
using System.Threading;
namespace CPUAuslastung {
internal class Program {
static void Main(string[] args) {
string folderName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string fileName = "CPU.txt";
StreamWriter sr = new StreamWriter(Path.Combine(folderName, fileName), true);
int counter = 0;
while (true) {
string Value2BeWritten = Program.OnTimedEvent().ToString();
string dateNTime = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
Console.WriteLine($"Write CPU-Auslastung in %:{Value2BeWritten} into file {fileName}");
sr.WriteLine($"CPU-Auslastung am {dateNTime}-->{Value2BeWritten}%");
if (counter >= 20) {
sr.Close();
Environment.Exit(0);
}
counter++;
Thread.Sleep(5000);
}
}
private static float OnTimedEvent() {
CPU objCPU = new CPU();
return objCPU.GetCPUusage();
}
}
}
using System;
using System.Diagnostics;
namespace CPUAuslastung {
internal class CPU {
public float GetCPUusage() // Liefert die aktuelle Auslastung zurück
{
PerformanceCounter cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total"; // "_Total" entspricht der gesamten CPU Auslastung, Bei Computern mit mehr als 1 logischem Prozessor: "0" dem ersten Core, "1" dem zweiten...
return cpuCounter.NextValue();
}
}
}
Der erste Abruf der CPU Werte sind immer 0 - und Du erstellst die ganze Zeit den Counter neu. Daher kann auch immer nur 0 heraus kommen.
If the calculated value of a counter depends on two counter reads, the first read operation returns 0.0.
Mit
static void Main(string[] args)
{
PerformanceCounter cpuCounter = new("Processor", "% Processor Time", "_Total");
while (true)
{
Console.WriteLine(cpuCounter.NextValue());
}
}
funktioniert alles einwandfrei.
Dein gesamter Code is aber nich wirklich stabil. Verwende einen PeriodicTimer statt einer Endlosschleife mit einem Thread.Sleep.
zB
static async Task Main(string[] args)
{
CancellationToken token = new(); // optional externes Canceln oder nach Zeit etc.
PerformanceCounter cpuCounter = new("Processor", "% Processor Time", "_Total");
using PeriodicTimer timer = new(TimeSpan.FromSeconds(1));
while (await timer.WaitForNextTickAsync(token) && !token.IsCancellationRequested)
{
Console.WriteLine(cpuCounter.NextValue());
}
}
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Vielen Dank. Das Objekt nur einmal zu erstellen und dann weiter zu geben fixt das Problem. Verwende im übrigen C# 7.3, so dass Dein Code nicht funktioniert.
Wenn Du wirklich noch C# 7.3 verwendest; das ist weit über 6 Jahre alt und Du verwendest eine .NET Version, die uralt ist.
[FAQ] Das .NET Ökosystem - .NET, .NET Core, .NET Standard, NuGet und Co
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code