90 votes

Comment obtenir l'utilisation du CPU en C# ?

Je veux obtenir l'utilisation totale du CPU pour une application en C#. J'ai trouvé de nombreuses façons de fouiller dans les propriétés des processus, mais je ne veux que l'utilisation du CPU des processus, et le CPU total comme vous obtenez dans le TaskManager.

Comment je fais ça ?

5voto

MtnManChris Points 51

Après avoir passé du temps à lire quelques fils de discussion différents qui semblaient assez compliqués, j'ai trouvé ceci. J'en avais besoin pour une machine à 8 cœurs où je voulais surveiller le serveur SQL. Pour le code ci-dessous, j'ai passé "sqlservr" comme nom d'application.

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

Il semble mesurer correctement le pourcentage de CPU utilisé par SQL sur mon serveur à 8 cœurs.

1voto

Colin Breame Points 179

Cette classe interroge automatiquement le compteur toutes les 1 secondes et est également thread safe :

public class ProcessorUsage
{
    const float sampleFrequencyMillis = 1000;

    protected object syncLock = new object();
    protected PerformanceCounter counter;
    protected float lastSample;
    protected DateTime lastSampleTime;

    /// <summary>
    /// 
    /// </summary>
    public ProcessorUsage()
    {
        this.counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    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;
    }
}

1voto

atconway Points 4164

Je n'ai pas aimé avoir à ajouter le décrochage d'une seconde à toutes les PerformanceCounter solutions. Au lieu de cela, j'ai choisi d'utiliser un WMI solution. La raison de l'attente d'une seconde est de permettre à la lecture d'être précise lors de l'utilisation d'une carte de crédit. PerformanceCounter . Cependant, si vous appelez cette méthode souvent et que vous rafraîchissez cette information, je conseillerais de ne pas avoir à subir constamment ce délai... même si vous pensez à faire un processus asynchrone pour l'obtenir.

J'ai commencé avec l'extrait d'ici Retourner l'utilisation du CPU dans WMI en utilisant C# et j'ai ajouté une explication complète de la solution sur mon billet de blog ci-dessous :

Obtenir l'utilisation du CPU sur tous les cœurs en C# à l'aide de WMI

0voto

Jay Byford-Rew Points 1

Ceci semble fonctionner pour moi, un exemple pour attendre que le processeur atteigne un certain pourcentage

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X