Laden...

CPU Auslastung immer bei 0

Letzter Beitrag vor 3 Monaten 4 Posts 339 Views
CPU Auslastung immer bei 0

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.

Siehe Docs:

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());
    }
}

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