La mayoría de los contadores de rendimiento de instancias múltiples en Windows parecen tener automáticamente (?) Un #n al final si hay más de una instancia con el mismo nombre.Nombrar contadores de rendimiento de varias instancias en .NET
Por ejemplo: si en Monitor de rendimiento, nos fijamos en la categoría Process
, podrás ver:
...
dwm
explorer
explorer#1
...
Tengo dos explorer.exe
procesos, por lo que el segundo contador tiene # 1 anexa a su nombre.
cuando intento hacer esto en una aplicación .NET:
- puedo crear la categoría, y registrar la instancia (utilizando el
PerformanceCounterCategory.Create
que toma unCounterCreationDataCollection
). - Puedo abrir el contador para escribir y escribir en él.
Cuando abro el contador por segunda vez (en otro proceso), abre el mismo contador. Esto significa que tengo dos procesos peleando por los contadores.
El documentation for PerformanceCounter.InstanceName
indica que #
no está permitido en el nombre.
Entonces, ¿cómo tengo contadores de rendimiento de varias instancias que son en realidad múltiples instancias? ¿Y dónde la segunda instancia (y subsecuente) obtiene #n
adjuntado al nombre?
Es decir: sé que puedo poner el ID del proceso (por ejemplo) en el nombre de la instancia. Esto funciona, pero tiene el desafortunado efecto secundario de que al reiniciar el proceso se genera un nuevo PID, y Perfmon continúa supervisando el contador anterior.
Actualización:
estoy creando la categoría (y contra) de la siguiente manera:
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);
}
Estoy abriendo el contador de la siguiente manera:
PerformanceCounter counter = new PerformanceCounter(
categoryName, counterName, instanceName, readOnly: false);
Cuando abre su contador de rendimiento por segunda vez, ¿lo está haciendo en un proceso diferente, o desde un componente diferente en el mismo proceso? – JMarsch
Proceso diferente. –
Creo que debe abrirlos con diferentes nombres de instancia. De lo contrario, terminará escribiendo en el contador equivocado. Además, consulte http://msdn.microsoft.com/en-us/library/dd537616.aspx, que parece sugerir que perfmon agrega el "n.º 1". – feroze