2015-02-02 33 views
7

Próbowałem uzyskać całkowite wykorzystanie procesora komputera z systemem Windows (Windows 7 z systemem .NET 4.5) w języku C#. Wygląda na to, że użycie PerformanceCounter powinno być w stanie zaspokoić moje potrzeby.W jaki sposób można uzyskać licznik wydajności do pracy bez konieczności przebudowania przez użytkownika przy użyciu polecenia lodctr w wierszu polecenia?

pisałem jakiś kod próbny w oparciu off trzy linki poniżej (i sprawdzanie strony MSDN), był to najbardziej podstawowa wersja:

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

      } 
     } 
    } 
} 

Ilekroć nextValue nazywa się błąd wyjątku poniżej jest wyzwalany. Wydaje się, że jest to częsty problem z problemem z wartościami liczników wydajności.

Nie można załadować dane Counter nazwę, ponieważ nieprawidłowy wskaźnik „” został odczytany z rejestru

najbardziej zalecane solutions sugerujemy odbudować uszkodzone elementy używając lodctr podniesionym oknie polecenia jako administrator. Jednak chciałem użyć PerformanceCounters w programie, który zostałby udostępniony dużej liczbie osób, a więc byłoby niewłaściwe oczekiwać, że przebudują swoje PerformanceCounters za pomocą okna poleceń.

Pytania:

  1. Dlaczego ten błąd wyjątku występującymi?
  2. W jaki sposób prawidłowo korzystać z PerformanceCounter?
  3. Jak mogę uniknąć pobierania przez moje programy użytkowników okna cmd i odbudowywania liczników wydajności?

Źródła:

  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 zadawane przez Annie Sheikh

+1

możliwy duplikat [Nie można załadować danych nazwy licznika, ponieważ nieprawidłowy indeks - wyjątek] (http://stackoverflow.com/questions/17980178/cannot-load-counter-name-data-because-an-invalid-index-exception) – DonBoitnott

+0

@DonBoitnott Hi Don, istota pytania jest podobny, chciałem jednak użyć PerformanceCounter wewnątrz programu, aby był on używany przez użytkownika końcowego, który nie powinien wchodzić i zmieniać wartości HKEY z regedit lub wiersza poleceń. Edytuję pytanie, aby było bardziej zrozumiałe – Luke

+2

To prawdopodobnie nie jest duplikat, ale jego część prawna wydaje się być poprawna. Musi czytać z 'LOCAL_MACHINE', notorycznie niedostępnej sekcji re. gistry. – DonBoitnott

Odpowiedz

1

Zgodnie z dokumentacją dla PerformanceCounter.NextValue, "Aby odczytać liczniki wydajności, musisz mieć uprawnienia administratora. "Dokumenty stwierdzają również, że zgłoszony zostanie wyjątek UnauthorizedAccessException, jeśli kod" "wykonywany bez uprawnień administratora próbował odczytać licznik wydajności. "

Ale to jest kłamstwo W moim środowisku Windows 7 (64-bitowa wersja Home Premium), z uruchomionym .NET 4.5, mogę uruchomić twój kod dobrze z niezaproszonej powłoki cmd na koncie administratora, lub standardowe konto użytkownika, a nawet konto gościa:

Jeśli napotkasz problem z przywilejami, najprawdopodobniej żadna liczba problemów z rejestracją nie pozwoli na niezawodne działanie twojego kodu dla wszystkich użytkowników. nie wiadomo, dlaczego twój kod działa poprawnie na koncie Gość bez uprawnień administratora, biorąc pod uwagę to, co mówi dokumentacja:

Inną opcją byłoby uruchomienie "wmic.exe cpu get loadpercentage "i przeanalizuj dane wyjściowe, zgodnie z sugestią podaną w this answer. W oparciu o moje testy działa to z konta administratora lub konta użytkownika standardowego, ale nie z konta gościa