Como obter o uso da CPU em c #?

Eu quero obter o uso total da CPU total para um aplicativo em c #. Eu encontrei muitas maneiras de cavar as propriedades dos processos, mas eu só quero o uso da CPU dos processos, e a CPU total como você entra no TaskManager.

Como faço isso?

    Você pode usar a class PerformanceCounter de System.Diagnostics .

    Inicialize assim:

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

    Consuma assim:

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

    Um pouco mais do que foi requerido, mas eu uso o código do timer extra para rastrear e alertar se o uso da CPU é de 90% ou mais por um período sustentado de 1 minuto ou mais.

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

    Depois de passar algum tempo lendo sobre um par de tópicos diferentes que pareciam bastante complicados eu cheguei com isso. Eu precisava disso para uma máquina de 8 núcleos onde eu queria monitorar o servidor SQL. Para o código abaixo, passei em “sqlservr” como appName.

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

    Parece medir corretamente o% de CPU sendo usado pelo SQL no meu servidor de 8 núcleos.

    Tudo bem, eu entendi! Obrigado pela ajuda!

    Aqui está o código para fazer isso:

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

    Você pode usar o WMI para obter informações sobre porcentagem de CPU. Você pode até fazer login em um computador remoto se tiver as permissions corretas. Veja em http://www.csharphelp.com/archives2/archive334.html para ter uma ideia do que você pode realizar.

    Também útil pode ser a referência do MSDN para o namespace Win32_Process .

    Veja também um exemplo de CodeProject Como: (quase) tudo no WMI via C # .

    CMS tem razão, mas também se você usar o explorador de servidores no visual studio e brincar com a aba do contador de desempenho, então você pode descobrir como obter muitas métricas úteis.

    Isso parece funcionar para mim, um exemplo de espera até que o processador atinja uma certa porcentagem

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

    Eu não gostei de ter que adicionar o box de 1 segundo a todas as soluções do PerformanceCounter . Em vez disso, escolhi usar uma solução WMI . A razão pela qual a espera de 1 segundo existe é permitir que a leitura seja precisa ao usar um PerformanceCounter . No entanto, se você chamar esse método com frequência e atualizar essas informações, eu aconselho a não ter que incorrer constantemente nesse atraso … mesmo que esteja pensando em fazer um processo asynchronous para obtê-lo.

    Eu comecei com o trecho de código Retornando o uso da CPU no WMI usando C # e adicionei uma explicação completa da solução no meu post abaixo:

    Obter o uso da CPU em todos os núcleos em C # usando o WMI

    Esta class pesquisa automaticamente o contador a cada 1 segundo e também é thread-safe:

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