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 einCounterCreationDataCollection
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);
Wenn Sie Ihren Leistungsindikator zum zweiten Mal öffnen, machen Sie es in einem anderen Prozess oder von einer anderen Komponente im selben Prozess? – JMarsch
Unterschiedlicher Prozess. –
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