Desejo obter o uso total total da CPU para um aplicativo em C #. Encontrei muitas maneiras de explorar as propriedades dos processos, mas quero apenas o uso da CPU e a CPU total como você obtém no TaskManager.
Pelo que eu descobri, eu tinha que usar cpuCounter.NextValue () duas vezes e entre eles eu tinha que Dormir (500)
Angel.King
Matt está certo. Mesmo incluindo os erros, como esquecer a palavra-chave "return".
usar o seguinte código
8
sim, parece uma cópia desse link; portanto, um link para referência do original teria sido um estilo legal. Por outro lado, também é bom que o CMS forneça a resposta aqui, para que desenvolvedores preguiçosos não precisem pesquisar em todo o Google para encontrar a mesma resposta. : o)
BerggreenDK
13
Você precisará chamar .NextValue duas vezes, com uma chamada System.Threading.Thread.Sleep no meio (1000ms deve ser suficiente). Consulte blogs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx para obter mais informações sobre por que isso é necessário, mas o resumo de alto nível é que você precisa de duas amostras para calcular o valor, e você precisa dar um tempo ao sistema operacional para obter os dois.
Cleggy
63
Um pouco mais do que foi solicitado, mas eu uso o código de timer extra para rastrear e alertar se o uso da CPU é 90% ou mais por um período prolongado de 1 minuto ou mais.
cpuCounter.NextValueretorna afloat . Então, por que atribuí-lo a um dynamic? Então, por que retornar isso dynamiccomo um object? Então, por que tentar atribuir um objecta um intna linha int cpuPercent = getCPUCounter()? (Esse código não irá compilar.)
Wyck
21
Depois de passar algum tempo lendo alguns tópicos diferentes que pareciam bastante complicados, eu vim com isso. Eu precisava dele para uma máquina de 8 núcleos onde queria monitorar o servidor SQL. Para o código abaixo, passei "sqlservr" como appName.
privatestaticvoidRunTest(string appName){bool done =false;PerformanceCounter total_cpu =newPerformanceCounter("Process","% Processor Time","_Total");PerformanceCounter process_cpu =newPerformanceCounter("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 a% de CPU usada pelo SQL no meu servidor de 8 núcleos.
Adicionar a obtenção do nome do servidor em vez da variável selectedServer foi melhor. como este.string nome_do_computador = Environment.GetEnvironmentVariable ("nome_do_computador");
Dave
9
Você pode usar o WMI para obter informações de porcentagem da CPU. Você pode até fazer login em um computador remoto se tiver as permissões corretas. Consulte http://www.csharphelp.com/archives2/archive334.html para ter uma idéia do que você pode realizar.
Também útil pode ser a referência do MSDN para o espaço para nome Win32_Process .
O CMS está certo, mas também se você usar o server explorer no visual studio e brincar com a guia do contador de desempenho, poderá descobrir como obter muitas métricas úteis.
System.DateTimeé na verdade um tipo de valor de 8 bytes, o que significa que as atribuições a uma DateTimevariável não são atômicas. Este código não é seguro para threads em plataformas de 32 bits.
andrewjs
1
Eu não gostei de ter que adicionar no estande de 1 segundo a todas as PerformanceCountersoluções. Em vez disso, optei por usar uma WMIsolução. A razão pela qual a espera / travamento de 1 segundo existe é permitir que a leitura seja precisa ao usar umPerformanceCounter . No entanto, se você chamar esse método com frequência e atualizar essas informações, aconselho a não ter que sofrer constantemente esse atraso ... mesmo que esteja pensando em fazer um processo assíncrono para obtê-lo.
Inclua a resposta aqui em vez de vincular ao seu blog.
Herman
@ Herman - eu não apenas criei um link para o meu blog; Dei uma explicação primeiro e comecei a fornecer um link para uma resposta detalhada além do post aqui.
atconway
a solução em seu blog é como 12 linhas de código. Por que não incluir isso em sua resposta, além de tentar levar as pessoas a visitar seu blog?
Herman
@ Herman - Qual é o problema em clicar no link, pois contém uma explicação detalhada; essa é a ideia da elaboração da porção 'por que'? Também isso tem 7 anos, apenas dizendo. Difícil lembrar esse post exato e eu ser um novato no SO naquela época.
atconway
o link pode ficar quebrado e é muito mais fácil verificar as respostas quando o conteúdo principal está embutido. Desculpe por ser duro na minha outra resposta, não estou aqui para lhe dar um tempo difícil. :)
Respostas:
Você pode usar a classe PerformanceCounter do System.Diagnostics .
Inicialize assim:
Consumir assim:
fonte
Um pouco mais do que foi solicitado, mas eu uso o código de timer extra para rastrear e alertar se o uso da CPU é 90% ou mais por um período prolongado de 1 minuto ou mais.
fonte
cpuCounter.NextValue
retorna afloat
. Então, por que atribuí-lo a umdynamic
? Então, por que retornar issodynamic
como umobject
? Então, por que tentar atribuir umobject
a umint
na linhaint cpuPercent = getCPUCounter()
? (Esse código não irá compilar.)Depois de passar algum tempo lendo alguns tópicos diferentes que pareciam bastante complicados, eu vim com isso. Eu precisava dele para uma máquina de 8 núcleos onde queria monitorar o servidor SQL. Para o código abaixo, passei "sqlservr" como appName.
Parece medir corretamente a% de CPU usada pelo SQL no meu servidor de 8 núcleos.
fonte
done
a verdade? A menos que eu tenha esquecido alguma coisa, isso parece ser um loop infinito:while(!done){...}
Está tudo bem, eu entendi! Obrigado pela ajuda!
Aqui está o código para fazer isso:
fonte
Você pode usar o WMI para obter informações de porcentagem da CPU. Você pode até fazer login em um computador remoto se tiver as permissões corretas. Consulte http://www.csharphelp.com/archives2/archive334.html para ter uma idéia do que você pode realizar.
Também útil pode ser a referência do MSDN para o espaço para nome Win32_Process .
Veja também um exemplo do CodeProject Como: (Quase) tudo no WMI via C # .
fonte
O CMS está certo, mas também se você usar o server explorer no visual studio e brincar com a guia do contador de desempenho, poderá descobrir como obter muitas métricas úteis.
fonte
Isso parece funcionar para mim, um exemplo de espera até que o processador atinja uma certa porcentagem
fonte
Essa classe pesquisa automaticamente o contador a cada 1 segundo e também é segura para threads:
fonte
System.DateTime
é na verdade um tipo de valor de 8 bytes, o que significa que as atribuições a umaDateTime
variável não são atômicas. Este código não é seguro para threads em plataformas de 32 bits.Eu não gostei de ter que adicionar no estande de 1 segundo a todas as
PerformanceCounter
soluções. Em vez disso, optei por usar umaWMI
solução. A razão pela qual a espera / travamento de 1 segundo existe é permitir que a leitura seja precisa ao usar umPerformanceCounter
. No entanto, se você chamar esse método com frequência e atualizar essas informações, aconselho a não ter que sofrer constantemente esse atraso ... mesmo que esteja pensando em fazer um processo assíncrono para obtê-lo.Comecei com o trecho daqui Retornando o uso da CPU no WMI usando C # e adicionei uma explicação completa da solução no meu blog abaixo:
Obter uso da CPU em todos os núcleos em C # usando WMI
fonte
Informações originais neste link https://gavindraper.com/2011/03/01/retrieving-accurate-cpu-usage-in-c/
fonte