Windows-Leistungsindikatoren verschwinden aus PerfMon

Ich bin völlig verblüfft von diesem: Auf einer Win7SP1, 64-Bit-Maschine,PerfMon scheint das Wissen über installierte, benutzerdefinierte Leistungsindikatoren völlig zu verleugnen. Ich arbeite mit einer vorhandenen Codebasis, mit der Zähler auf Produktionsmaschinen einwandfrei installiert werden. Wenn ich sie jedoch auf meiner Maschine ausführe, wenn ich sie mit den von mir hinzugefügten Zählern ausführe oder wenn ich eine vollständig erfundene Assembly ausführe (die Fleisch, von dem unten geklebt wird), bekomme ich ernsthaft komisches Verhalten.

Mit dem folgenden Code-Snippet lässt sich das wahrscheinlich am einfachsten beschreiben:

<code>var category = "SuperTest";
var counterName = "Test Counter 1";
var shouldInstall = true;

if (PerformanceCounterCategory.Exists(category))
{
    shouldInstall = false;
    Console.WriteLine("{0} Category Exists. Overwrite? [n]", category);
    var input = Console.ReadLine();
    if (bool.TryParse(input, out shouldInstall))
    {
        PerformanceCounterCategory.Delete(category);
    }
}
if (shouldInstall)
{
    var col = new CounterCreationDataCollection();
    col.Add(new CounterCreationData()
    {
        CounterName = counterName,
        CounterType = PerformanceCounterType.NumberOfItems64
    });

    PerformanceCounterCategory.Create(category, "Test category.", PerformanceCounterCategoryType.SingleInstance, col);
    // Magical voodoo line that may indicate my inexperience, but whose inclusion or
    // exclusion does not affect discernibly affect behavior.
    PerformanceCounter.CloseSharedResources();
}

// Multithreading setup, each thread repeats block below infinitely:
{
    System.Threading.Thread.Sleep((new Random()).Next(100));
    try
    {
        var counter = new PerformanceCounter(category, counterName, false));
        c.Increment();
    }
    catch (Exception ex) { /* ... */ }
}
</code>

Bei der ersten Ausführung ist die Kategorie nicht vorhanden, und die Kategorie und der Zähler werden erstellt. Ich bringe den Prozess zum Erliegen und öffne ihnPerfMon. An diesem Punkt kann ichAdd CounterSieh dir die Kategorie und den Zähler an, füge sie perfekt hinzu und schau zu, wie sie sitzen0.000. Perfekt. An diesem Punkt, wenn ich schließePerfMon und wieder öffnen? Ich kann alle Systemleistungsindikatoren gut sehen, aber alle meine benutzerdefinierten - wie bereits erwähnt - diejenigen, die in Produktionen funktionieren, die ich basierend auf diesen erstellt habe.und die erfundenen - sind einfach weg.

Das Interessante ist, dass wenn ich den obigen Code ausführe, er mir konsistent mitteilt, dass die Gruppe existiert. Tiefer tauchen, der Zähler existiert sogar. Das kommt mir komisch vor. Lasse es noch im verschwundenen Zustand und nimm ein Stichwort vonHier, Ich kann rennen:lodctr /R, und sietun Komm zurück.

Es sieht also so aus, als würde ich meinen eigenen Leistungsindikator-Laden beschädigen. Meine Frage besteht aus zwei Teilen:

Ist es das, was ich tue (den Leistungsindikatorspeicher beschädigen)?Gibt es etwas, das im Code oder in meinem Prozess, den ich zur Erstellung dieses Verhaltens durchführe, auffällt, da es reproduzierbar ist?

In meinen Augen ist dies etwas anders als bei anderen Fragen zu Leistungsindikatoren, da sie existieren und ich beobachte, wie sie verschwinden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage