Большинство счетчиков производительности нескольких экземпляров в Windows, кажется, автоматически (?) Имеют в конце #n, если существует более одного экземпляра с одинаковым именем.
Например: если в Perfmon вы смотритев категории Process
вы увидите:
...
dwm
explorer
explorer#1
...
У меня есть два explorer.exe
процесса, поэтому ко второму счетчику добавляется # 1 к его имени.
Когда я пытаюсьЧтобы сделать это в приложении .NET:
- Я могу создать категорию и зарегистрировать экземпляр (используя
PerformanceCounterCategory.Create
, который принимает CounterCreationDataCollection
). - Я могуоткройте счетчик для записи и запишите в него.
Когда я открываю счетчик второй раз (в другом процессе), он открывает тот же счетчик.Это означает, что у меня есть два процесса, сражающихся за счетчики.
Документация для PerformanceCounter.InstanceName
гласит, что #
не допускается в имени.
Итак:Как я могу иметь счетчики производительности нескольких экземпляров, которые на самом деле несколько экземпляров?И где второй (и последующие) экземпляры добавляются #n
к имени?
То есть: я знаю, что могу поместить идентификатор процесса (например) в имя экземпляра.Это работает, но имеет неприятный побочный эффект: перезапуск процесса приводит к новому PID, а Perfmon продолжает отслеживать старый счетчик.
Обновление:
I'mсоздаем категорию (и счетчик) следующим образом:
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);
}
Я открываю счетчик следующим образом:
PerformanceCounter counter = new PerformanceCounter(
categoryName, counterName, instanceName, readOnly: false);