Los contadores de rendimiento de Windows desaparecen de PerfMon

Estoy completamente desconcertado (TM) por este: en una máquina Win7SP1 de 64 bits,PerfMon Parece estar desestimando completamente el conocimiento de los contadores de rendimiento personalizados instalados. Estoy trabajando con una base de código existente que está instalando contadores perfectamente bien en las máquinas de producción, pero cuando lo ejecuto en mi máquina, cuando lo hago con los contadores que agregué, o si ejecuto un ensamblaje completamente diseñado (el La carne de la que se pega a continuación), tengo un comportamiento muy raro.

Probablemente sea más fácil de describir usando el siguiente fragmento de código:

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

La primera vez que se ejecuta, la categoría no existe y continúa creando la categoría y el contador. Mato el proceso, luego abroPerfMon. En este punto, puedoAdd Counter, vea la categoría y el contador, agréguelo perfectamente, y mire cómo se sienta en0.000. Perfecto. En este punto, si cierro.PerfMon y reabrirlo? Puedo ver todos los contadores de rendimiento del sistema muy bien, pero todos mis personalizados, como se mencionó anteriormente, los que funcionan en producciones, los que creé basados ​​en esos,y Los inventados - se han ido.

Lo interesante es que si ejecuto el código anterior, siempre me dirá que el grupo existe. Buceo más profundo, incluso existe el contador. Esto me parece raro. Dejándolo todavía en el estado de desaparecido, y siguiendo el ejemplo deaquí, Puedo correr:lodctr /R, y elloshacer Vuelve.

Así que parece que de alguna manera estoy corrompiendo mi propia tienda de contador de rendimiento. Mi pregunta tiene dos partes:

¿Es esto lo que estoy haciendo (corromper la tienda de contador de rendimiento)?Dado que es reproducible, ¿hay algo que se destaque en el código o en mi proceso que estoy haciendo para crear este comportamiento?

En mi opinión, esto es algo diferente de la pregunta de otros "contadores de rendimiento perdidos", porque existen y los estoy viendo desaparecer.

Respuestas a la pregunta(2)

Su respuesta a la pregunta