2015-02-02 18 views
7

Ho cercato di ottenere l'utilizzo totale della CPU di Windows PC (Windows 7 con .Net 4.5) in C#. Sembra che l'utilizzo di PerformanceCounter dovrebbe essere in grado di soddisfare le mie esigenze.Come posso far funzionare il contatore delle prestazioni senza che l'utente debba ricostruire con lodctr in un prompt dei comandi?

ho scritto un codice di prova in base al largo i tre link qui sotto (e controllando le pagine MSDN), questa è stata la più semplice versione:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Diagnostics; 

namespace EntropyProject 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PerformanceCounter cpuCounter; 

      cpuCounter = new PerformanceCounter(); 

      cpuCounter.CategoryName = "Processor"; 
      cpuCounter.CounterName = "% Processor Time"; 
      cpuCounter.InstanceName = "_Total"; 


      while(true) 
      { 
       try 
       { 
        float firstValue = cpuCounter.NextValue(); 
        System.Threading.Thread.Sleep(500); 
        Console.WriteLine("Before getting processor:"); 
        float currentCpuUsage = cpuCounter.NextValue(); 
        Console.WriteLine("After getting processor:"); 
        System.Threading.Thread.Sleep(1000); 

        Console.WriteLine(currentCpuUsage); 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("\n{0}\n", e.Message); 
       } 
       System.Threading.Thread.Sleep(10000); 

      } 
     } 
    } 
} 

Ogni volta NextValue è chiamato l'errore di eccezione di seguito viene attivato. Questo sembra essere un problema comune con un problema con i valori del contatore delle prestazioni.

Impossibile caricare i dati nome del contatore, perché un indice non valido '' è stato letto dal Registro di sistema

Il più consigliato solutions suggeriscono che si ricostruisce gli elementi danneggiati utilizzando lodctr in una finestra di comando rialzata come amministratore. Tuttavia volevo usare PerformanceCounters in un programma che sarebbe stato rilasciato a un gran numero di persone e quindi sarebbe inappropriato aspettarsi che ricostruiscano i propri PerformanceCounters usando la finestra dei comandi.

Domande:

  1. Perché questo errore di eccezione che si verificano?
  2. Come si utilizza correttamente PerformanceCounter altrimenti?
  3. Come posso evitare che gli utenti dei miei programmi debbano aprire una finestra cmd e ricostruire i loro contatori delle prestazioni?

Fonti:

  1. How to get cpu usage in C

  2. Get current cpu utilisation in

  3. How can I get the total CPU usage?

Similar Question about error when accessing counter name poste dai Annie Sheikh

+1

possibile duplicato di [Impossibile caricare i dati del nome contatore perché un indice non valido -Exception] (http://stackoverflow.com/questions/17980178/cannot-load-counter-name-data-because-an-invalid-index-exception) – DonBoitnott

+0

@DonBoitnott Ciao Don, l'essenza della domanda è simile, ma volevo usare PerformanceCounter all'interno di un programma per essere utilizzato da un utente finale che non dovrebbe aver bisogno di entrare e modificare i valori di HKEY da regedit o da un prompt dei comandi.Vado a modificare la domanda per renderla più chiara – Luke

+2

Probabilmente non è un duplicato, ma la parte delle autorizzazioni sembra valida. Deve leggere da 'LOCAL_MACHINE', una sezione notoriamente off-limits del re gistry. – DonBoitnott

risposta

1

Secondo la documentazione per PerformanceCounter.NextValue, "Per leggere i contatori delle prestazioni, è necessario disporre dei privilegi di amministratore. "I documenti affermano inoltre che verrà generata una UnaExhorizedAccessException se" Codice in esecuzione senza privilegi amministrativi ha tentato di leggere un contatore delle prestazioni. "

Ma questa è una menzogna. Al mio ambiente Windows 7 (64-bit Edition Home Premium), in esecuzione .NET 4.5, posso eseguire il codice bene da una cmd non-raise shell su un account di amministratore, o un account utente standard o anche un account ospite

Se si verifica un problema con privilegi, molto probabilmente nessuna quantità di manipolazione del registro consentirà al codice di funzionare in modo affidabile per tutti gli utenti. non è chiaro il motivo per cui il tuo codice funziona bene su un account Guest senza privilegi di amministratore, dato quello che dice la documentazione

Un'altra opzione sarebbe quella di eseguire "wmic".exe cpu get loadpercentage "e analizza l'output, come suggerito in this answer. Sulla base dei miei test funziona da un account amministratore o utente standard, ma non da un account Guest.