2009-09-21 12 views
5

Debo estar haciendo algo muy mal aquí. Puedo crear un contador de rendimiento personalizada de la siguiente manera:¿Por qué no cambiarán mis contadores de rendimiento?

string counterCategory = "Test Category"; 
string counterName = "Test Counter"; 

if (!PerformanceCounterCategory.Exists(counterCategory)) 
{ 
    Console.WriteLine("Creating Counters"); 

    CounterCreationDataCollection counterCreationDataCollection = 
     new CounterCreationDataCollection(); 

    counterCreationDataCollection.Add(
     new CounterCreationData(counterName, 
     "Description", 
     PerformanceCounterType.NumberOfItems32) 
    ); 

    PerformanceCounterCategory.Create(counterCategory, 
     "My category description/Help", 
     PerformanceCounterCategoryType.SingleInstance, 
     counterCreationDataCollection); 
} 

La categoría de contador y el contador se crean y se podrá ver en el monitor de rendimiento.

que a continuación, intenta cambiar el valor del contador

PerformanceCounter myCounter = 
    new PerformanceCounter(counterCategory, counterName, false); 

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Setting to "+i); 
    myCounter.RawValue = i; 
    Thread.Sleep(200); 
} 

myCounter.Close(); 

Sin embargo, ya que sentarse y ver el contador de monitor de rendimiento no pasa nada, el valor nunca cambia.

Entonces, ¿qué estoy haciendo mal?

Si agrego una llamada a nextValue(), o rawValue() el valor de eso se devuelve como esperaba, pero el Monitor de rendimiento de Windows aún muestra una línea plana, p.

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Setting to "+i); 
    myCounter.IncrementValue() 
    Console.WriteLine("Next Value = "+myCounter.RawValue()); 
    Thread.Sleep(200); 
} 

Editar: He descubierto que si cierro el monitor de rendimiento y luego volver a abrirlo sin borrar los contadores, que de repente se da cuenta de que hay un nuevo valor. Por lo tanto, los valores se establecen y persisten, sin embargo, el Monitor de rendimiento no ve los cambios.

Respuesta

2

Un seguimiento está en orden. Al parecer, en Win7 de todos modos, es posible que el monitor de rendimiento no funcione como se esperaba. Cuando escribí el código de prueba, detuve la aplicación después de crear los contadores, para iniciar el monitor de rendimiento. Una vez que lo dejé continuar, el monitor nunca cambió sus contadores, a pesar de que se cambió el contador subyacente.

Si salgo del monitor de rendimiento y lo reinicio, se mostrará el último valor del contador en el programa de prueba, lo que indica que se está configurando correctamente. Si luego volviera a ejecutar el programa de prueba, simplemente cambiando los valores, el monitor de rendimiento finalmente captaría los cambios.

Así que el código, como todos indicaron es correcto, fue el monitor de rendimiento de Windows que se estaba portando mal.

¡Gracias a todos por sus respuestas!

+0

O en mi caso, un reinicio. –

0

Tu código se ve bien. De mi ejemplo de trabajo, la única diferencia es que llamo al método de incremento después de configurar RawValue.

PerformanceCounter myCounter = 
    new PerformanceCounter(counterCategory, counterName, false); 

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Setting to "+i); 
    myCounter.Increment(); 
    Thread.Sleep(200); 
} 

myCounter.Close(); 
+0

No, sigo siendo una línea plana, me temo, con Incremento() y con la configuración de RawValue. – blowdart

+0

Gracioso. Lo examinaré durante el almuerzo. – Dejan

1

¿Es posible en el curso de sus pruebas que haya cambiado el nombre del contador? Su código no verifica que la categoría contenga su contador; solo verifica si la categoría existe, y si lo hace, no crea la categoría.

Si ha cambiado los nombres de los contadores desde la primera creación de la categoría, su nuevo contador no existiría en la categoría y es posible que le falte una pequeña diferencia en el nombre del contador cuando lo mire en el Monitor de rendimiento.

+0

Es una buena idea, pero eliminaré la categoría antes de ejecutar esto, por lo que volverá a crearse, y luego tanto el nombre de la categoría como el nombre del contador se mantendrán en cadenas utilizadas tanto para la creación como para la apertura del contador. – blowdart

+1

¿Es esto parte de un proyecto más grande? Cuando tomé el código de la pregunta y lo envolví en el método 'static void Main (string [] args)' de un proyecto de consola, funcionó sin modificaciones.Necesitaba ejecutarlo dos veces, una para crear la categoría para poder encontrarlo en el Monitor de rendimiento, luego una segunda vez para ver los valores cambiar. – GBegen

+0

Esto fue en una aplicación de consola (y por diversión una página web para establecer valores sin formato). Terminé cerrando el monitor de rendimiento y abriendo de nuevo y, de repente, vi los cambios. Puede ser que no le gusta monitorear justo después de que se crea un contador. – blowdart

Cuestiones relacionadas