Laden...

[erledigt] PerformanceCounter Leistungsindikatoren

Erstellt von DeZio vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.322 Views
DeZio Themenstarter:in
76 Beiträge seit 2008
vor 12 Jahren
[erledigt] PerformanceCounter Leistungsindikatoren

Hallo, ich habe folgende Codestellen im Internet mehrfach gefunden, um die aktuellen RAM-Informationen und die Prozentauslastung der CPU zu erhalten. Auch hat dies früher auf meinem alten Rechner unter .Net 3.5 funktioniert.


PerformanceCounter pc = new PerformanceCounter("Memory", "Available MBytes", String.Empty);
PerformanceCounter cpuload = new PerformanceCounter("Processor", "% Processor Time", "_Total");
objData.RAMMegabyte = (pc.RawValue / 1024);
objData.ProcessCount = Process.GetProcesses().Length;
cpuload.NextValue();
objData.CPUPercent = cpuload.NextValue();
objData.DateTime = DateTime.Now;

Aber leider wird mir bei Memory und auch bei Processor eine Exception geworfen.> Fehlermeldung:

Die Kategorie ist nicht vorhanden.

Dann habe ich mir eine Liste ausgeben lassen von derer Leistungsindikatoren, die auf meinem Rechner quasi installiert sind:

IKEv1, AuthIP und IKEv2 allgemein
Physikalischer Datenträger
Netzwerkaktivitätszyklen pro Prozessor
NBT-Verbindung
UDPv6
.NET-Datenanbieter für Oracle
Thread
Datenbank  ==> Instanzen
.NET Memory Cache 4.0
Datenbank
WF (System.Workflow) 4.0.0.0
ICMP
Synchronisierung
.NET CLR-Speicher
Datenbank ==> TableClasses
SMSvcHost 3.0.0.0
WMI-Objekte
Prozess
Outlook
TCPv6
USB
.NET CLR-Ladevorgang
RAS-Port
ICMPv6
IPv4
.NET CLR-Jit
Redirectordienst
URL-Gruppen für HTTP-Dienst
WFPv4
ASP.NET
Auftragsobjekt
Netzwerkschnittstellenkarten-Aktivität pro Prozessor
Ereignisablaufverfolgung für Windows
UDPv4
ASP.NET-Zustandsdienst
Logischer Datenträger
.NET CLR-Interop
Teredo-Client
Serverwarteschlangen
IPv6
ServiceModelEndpoint 3.0.0.0
Teredorelay
Distributed Transaction Coordinator
Druckerwarteschlange
Prozessorinformationen
IPSec IKEv2 IPv6
Systemweite Sicherheitsstatistiken
IPSec IKEv2 IPv4
RAS insgesamt
.NET CLR-Daten
Auftragsobjektdetails
ServiceModelService 3.0.0.0
Telefonie
Windows Workflow Foundation
Suchdienst
Terminaldienstesitzungen
Sitzung der Ereignisablaufverfolgung für Windows
TCPv4
IPsec AuthIP IPv4
HTTP-Dienst
Terminaldienste
ServiceModelOperation 3.0.0.0
Teredo-Server
Such-Gatherer-Projekte
WFPv6
SMSvcHost 4.0.0.0
IPsec-Treiber
MSDTC Bridge 4.0.0.0
Clientseitige Zwischenspeicherung
IPsec IKEv1 IPv4
IPsec IKEv1 IPv6
Server
MSDTC Bridge 3.0.0.0
ASP.NET v4.0.30319
.NET Data Provider for MySQL
WFP
ASP.NET Apps v4.0.30319
.NET CLR-Sicherheit
Sicherheitsstatistiken pro Prozess
IPsec AuthIP IPv6
ASP.NET-Anwendungen
Such-Gatherer
.NET CLR-Sperren und Threads
Peer Name Resolution-Protokoll
BITS, Netzwerknutzung
.NET CLR-Ausnahmen
Netzwerkschnittstelle
Pacer-Pipe
.NET CLR-Netzwerk
Anforderungswarteschlangen für HTTP-Dienst
Offlinedateien
IP-HTTPS-Global
.NET-Datenanbieter für SqlServer
Processor Performance
Indexerstellung für die Suche
.NET CLR-Netzwerk 4.0.0.0
.NET CLR-Remote

Und an dieser Stelle bin ich überfragt. Sind die Indikatorennamen nun Länderspezifisch? Oder sogar Prozessorspezifisch? Wie komme ich nun an die RAM und CPU-Infos?

Grüße
Dennis Z.

A
764 Beiträge seit 2007
vor 12 Jahren

War der alte Rechner zufällig XP und der neue ist Win7? Dann hilft vllt das Programm als Administrator zu starten.

DeZio Themenstarter:in
76 Beiträge seit 2008
vor 12 Jahren

Ja, deine Annahme ist korrekt. Aber das Starten als Administrator bringt keinen gewünschten Effekt:

Fehlermeldung:
[Window Title]
WindowsFormsApplication1

[Main Instruction]
WindowsFormsApplication1 funktioniert nicht mehr

[Content]
Es wird nach einer Lösung für das Problem gesucht...

[Abbrechen]

Habs aber dann schöner gemacht und eine Exception werfen lassen. Bei beiden meckert er weiterhin.

Fehlermeldung:

Fehler

System.InvalidOperationException: Die Kategorie ist nicht vorhanden.

bei System.Diagnostics.PerformanceCounterLib.CounterExists(String machine, String category, String counter)

bei System.Diagnostics.PerformanceCounter.InitializeImpl()

bei System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName, String instanceName, Boolean readOnly)

bei System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName, String instanceName)

bei WindowsFormsApplication1.Messdaten.GetActualData() in I:\LG_Prog\WindowsFormsApplication1\WindowsFormsApplication1\Messdaten.cs:Zeile 30.


OK

W
872 Beiträge seit 2005
vor 12 Jahren

Lese mal mit

txtMachine.Text = Environment.MachineName; 
//Retrieve the Categories of Performance Counters available on the machine:

// Get the Categories of Performance Counters
performanceCountersMgr.GetPerformanceCountersCategories(txtMachine.Text.ToString());
PerformanceCounterCategory[] categories = performanceCountersMgr.Categories;
for (int i = 0; i < categories.Length; i++)
{
    // Show these at the UI
    Console.WriteLine(categories[i]);
}

Deine moeglichen Counter aus - kann auch gut an so Sachen wie Spracheinstellung liegen, dass es auf dem einen Rechner funktioniert und auf dem anderen nicht...

4.942 Beiträge seit 2008
vor 12 Jahren

Hallo DeZio,

bzgl. fehlender Counter lies dir mal Performance counters missing from results durch (gilt allgemein, nicht nur für den ANTS Profiler 😉

Eine andere Möglichkeit besteht im Aufruf der GlobalMemoryStatus-Funktion - hier als .NET-Klasse: MemoryInfo - Abfragen von Informationen über den Speicher

W
872 Beiträge seit 2005
vor 12 Jahren

Ganz abgesehen davon, dass der verfuegbare Speicher nichts mit dem Speicher zu tun hat, denn Du fuer Deine .NET Applikation verfuegbar hast...
Out of memory does not refer to physical memory.

Hinweis von herbivore vor 12 Jahren

Wobei der Artikel eigentlich heißen müsste:

Out of memory does not refer to physical memory only

bzw. auf deutsch

Eine OutOfMemoryException bezieht sich nicht nur auf physischen Speicher

DeZio Themenstarter:in
76 Beiträge seit 2008
vor 12 Jahren

Vielen Dank!
Also am besten die Finger vom PerformanceCounter lassen. Gut zu wissen. Dann werde ich mich wohl an p/invokes bedienen.

Grüße
Dennis Z.

U
1.688 Beiträge seit 2007
vor 12 Jahren

Sind die Indikatorennamen nun Länderspezifisch?

Jein - eher "kulturspezifisch". Mit

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");

bekommst Du die englischen Bezeichner wieder. Je nachdem, ob Du einen dedizierten Thread oder den Threadpool nimmst, solltest Du aber die vorherige CurrentCulture zwischenspeichern und nach der Abfrage wieder zurücksetzen.