Конструктор PerformanceCounterCategory против метода create - PullRequest
0 голосов
/ 02 июля 2018

PerformanceCounterCategory class имеет как конструктор , так и Create метод.
Оба создают собственную категорию счетчиков производительности.
Единственное отличие, которое я вижу из документации, состоит в том, что метод create также добавляет счетчики производительности в категорию, которую он создает.

Однако, когда я тестировал создание пользовательской категории с помощью метода create, я не мог после этого связать с ним счетчик производительности.

PerformanceCounterCategory myCat = new PerformanceCounterCategory("test");
PerformanceCounter counter = new PerformanceCounter(myCat.CategoryName, "asd", Process.GetCurrentProcess().ProcessName);
//The second line throws an System.InvalidOperationException: 'Category does not exist.' exception

Хотя, если я использую метод «Создать», исключение не выдается (игнорируйте имя счетчика для этого вопроса).

Я не увидел в документации ничего, что могло бы предположить такое поведение.

Это преднамеренно или я что-то упускаю при использовании constructor? Кроме того, каковы различия между использованием конструктора и метода создания?

1 Ответ

0 голосов
/ 02 июля 2018

Распространенной проблемой при использовании счетчиков производительности Windows является желание создавать их «на лету» по мере необходимости, при каждом новом запуске создавая все счетчики, подходящие для этой версии кода.

Счетчики производительности Windows были разработаны и внедрены давно, очень давно и, как таковые, предназначены для регистрации во время какого-либо процесса установки. Тогда все программное обеспечение любой важности проходило процесс установки, инициированный пользователем, при первой установке и во время любых обновлений. Фактически, для регистрации категории счетчиков производительности и соответствующих ей счетчиков требуются довольно высокие привилегии (например, вы не можете сделать это в IIS с привилегиями по умолчанию). Система также не позволяет вносить изменения в счетчики на лету. Это имеет то преимущество, что клиенты могут запрашивать доступные счетчики и знать, что они не будут меняться во время их сбора (по крайней мере, во время выполнения соответствующего процесса). Если вы хотите что-то, что может динамически изменяться, вам придется свернуть свое собственное (это не так сложно, если вы не хотите, чтобы они отображались в мониторе производительности Windows).

Итак, правильное использование счетчиков производительности заключается в следующем: во время установки создать категорию счетчиков производительности и соответствующие счетчики:

PerformanceCounterCategory.Create ("My category", "Category Description", PerformanceCounterCategoryType.SingleInstance, counterCreationDataCollection /* <--premade, hardcoded list of counters */);

и во время обычного выполнения подключиться к категории счетчика производительности, ранее зарегистрированной с помощью Create, как указано выше:

private static PerformanceCounterCategory _MyCategory = new PerformanceCounterCategory("My category");  // connect to the previously-registered performance counter category so we can set counter values

Конструктор, который принимает имя компьютера, должен действовать как клиент для сбора статистики с другого компьютера.

Также следует помнить, что существует ограничение на количество счетчиков производительности в вашей программе, и что для запроса значений также требуются специальные сетевые привилегии. Ограничение зависит от размера имен счетчиков и справки, а также от их значений, и их очень сложно изменить, поэтому вы, вероятно, захотите избежать этого (исходя из опыта, я могу сказать, что когда вы это делаете, различные счетчики после предел будет отображаться для всех имеют одинаковое значение). Несмотря на ограничения, они могут быть весьма полезны при многих обстоятельствах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...