2010-06-07 5 views
10

Die meisten Leistungsindikatoren für mehrere Instanzen in Windows scheinen automatisch (?) Ein #n am Ende zu haben, wenn mehrere Instanzen mit demselben Namen vorhanden sind.Benennen von Leistungsindikatoren für mehrere Instanzen in .NET

Zum Beispiel: Wenn in Perfmon Sie den Blick unter Process Kategorie, werden Sie sehen:

... 
dwm 
explorer 
explorer#1 
... 

Ich habe zwei explorer.exe Prozesse, so dass der zweite Zähler hat # 1 zu seinem Namen angehängt.

Wenn ich versuche, dies in einer .NET-Anwendung zu tun:

  • ich die Kategorie erstellen und registrieren die Instanz (die PerformanceCounterCategory.Create verwenden, das ein CounterCreationDataCollection nimmt).
  • Ich kann den Zähler für schreiben öffnen und schreiben.

Wenn ich den Zähler ein zweites Mal (in einem anderen Prozess) öffne, öffnet es den gleichen Zähler. Das bedeutet, dass ich zwei Prozesse habe, die über die Zähler streiten.

Die documentation for PerformanceCounter.InstanceName besagt, dass # im Namen nicht zulässig ist.

Also: Wie habe ich mehrere Instanzen Leistungsindikatoren, die eigentlich mehrere Instanzen sind? Und wo die zweite (und nachfolgende) Instanzen bekommen #n an den Namen angehängt?

Das heißt: Ich weiß, dass ich die Prozess-ID (z. B.) auf den Instanznamen setzen kann. Dies funktioniert, hat aber den unerwünschten Nebeneffekt, dass das Neustarten des Prozesses zu einer neuen PID führt und Perfmon weiterhin den alten Zähler überwacht.

Update:

Ich erstelle die Kategorie (und Zähler) wie folgt:

const string categoryName = "Test App"; 
const string counterName = "Number of kittens"; 
string instanceName = 
    Path.GetFileNameWithoutExtension(
     Process.GetCurrentProcess().MainModule.FileName); 

if (!PerformanceCounterCategory.Exists(categoryName)) 
{ 
    var counterCreationDataCollection = new CounterCreationDataCollection 
     { 
      new CounterCreationData(counterName, "", 
       PerformanceCounterType.NumberOfItems32) 
     }; 

    PerformanceCounterCategory.Create(categoryName, "", 
     PerformanceCounterCategoryType.MultiInstance, 
     counterCreationDataCollection); 
} 

ich den Zähler bin Öffnen Sie wie folgt vor:

PerformanceCounter counter = new PerformanceCounter(
     categoryName, counterName, instanceName, readOnly: false); 
+0

Wenn Sie Ihren Leistungsindikator zum zweiten Mal öffnen, machen Sie es in einem anderen Prozess oder von einer anderen Komponente im selben Prozess? – JMarsch

+0

Unterschiedlicher Prozess. –

+0

Ich denke, dass Sie sie mit verschiedenen Instanznamen öffnen müssen. Andernfalls werden Sie am falschen Zähler schreiben. Siehe auch http://msdn.microsoft.com/en-us/library/dd537616.aspx, was darauf hindeutet, dass "# 1" von perfmon hinzugefügt wird. – feroze

Antwort

2

Ich denke, Ihr Problem besteht darin, dass .NET in Bezug auf Leistungsindikatoren eher losgelöst ist und die PerfLib Win-API umgeht.

Wenn Sie die systemeigene PerfLib-API verwenden, registrieren Sie Kategorien während des Setups und erstellen Instanzen aus dem Prozess mithilfe von Handles. Mit der nativen API gibt es keine direkte Möglichkeit, eine Gegeninstanz freizugeben. Wenn also auf zwei Zählerinstanzen mit demselben Namen zugegriffen wird, haben sie tatsächlich unterschiedliche Handles und sind entsprechend mit # gekennzeichnet.

In. NET, wie Sie einfach einen Zähler und eine Instanz mit Namen adressieren, sind Sie in Gefahr von Cross-Updates. Da .NET den Namen übernimmt und die Instanzen auflistet (unter Verwendung der WMI), selbst wenn sie von einer anderen Anwendung verwendet werden.

Ich denke, dass das Hinzufügen der PID * ist in der Tat die klügste Lösung - da Sie beide bessere Track-Fähigkeit und keine Kollision haben. In Bezug auf das Problem mit Neustart beim Erstellen eines neuen Zählers, sehe ich das Problem nicht; Wenn Sie zulassen, dass mehr als eine Instanz des Prozesses zu einem bestimmten Zeitpunkt ausgeführt wird, wie würden Sie wissen, ob diese Instanz aufgrund eines Neustarts erstellt wurde oder einfach eine andere ausführbare Datei ausgeführt hat?

Wenn Sie eine Abhängigkeit zwischen den Prozessen haben, können Sie veraltete Zähler bereinigen oder eine andere Logik verwenden. In PerfMon können Sie "*" alle Instanzen ansehen.

* Oder wenn Sie eine gewisse Logik hinter dem Prozess haben, der ohne Rücksicht auf Neustarts beibehalten wird - wie zum Beispiel eine Task-ID.