Почему счетчик "Идентификатор процесса" в категории ".NET CLR Memory" постоянно равен нулю?

В категории счетчика производительности ".NET CLR Memory" есть счетчик с именем "Идентификатор процесса". Предполагается, что любой данный экземпляр этого счетчика возвращает идентификатор процесса Windows, связанный с этим экземпляром. Для моих собственных процессов этот счетчик всегда имеет нулевое значение. Это почему?

Если я посмотрю на devenv экземпляр счетчика возвращает ожидаемое значение - по крайней мере, значение соответствует идентификатору процесса, сообщенному диспетчером задач.

Если я запускаю собственное приложение в режиме отладки и проверяю PerfCounterTest.vshost экземпляр счетчика, он всегда имеет значение ноль.

Если я запускаю собственное приложение без отладчика, PerfCounterTest Экземпляр всегда равен нулю.

Если я запускаю несколько экземпляров своего собственного приложения, экземпляры с порядковыми номерами PerfCounterTest#1, PerfCounterTest#2... все имеют значение ноль.

Почему этот счетчик всегда равен нулю и, поскольку он всегда равен нулю, как мне найти имя экземпляра, связанное с моим процессом, учитывая, что оно может не иметь уникального имени?

1 ответ

Решение

Как это случается, экземпляр этого счетчика будет иметь значение ноль, пока в процессе, связанном с этим экземпляром, не произойдет первая сборка мусора.

Этот факт задокументирован в тексте справки счетчика, связанном со счетчиком "Идентификатор процесса":

Этот счетчик отображает идентификатор процесса отслеживаемого экземпляра процесса CLR. Отображаемое значение будет 0 до окончания первой сборки мусора.

Незаметность проистекает из того факта, что, хотя вы можете легко прочитать этот текст, используя System.Diagnostics namespace, другой документации по этому вопросу нет. Я искал MSDN, TechNet и Интернет и ничего не нашел. Даже после обнаружения ответа я открыл PerfMon и попытался найти эту строку в пользовательском интерфейсе - насколько мне известно, она нигде не отображается.

Для дальнейшего использования, вот как вы запрашиваете текст справки счетчика:

using (Process process = Process.GetCurrentProcess())
{
    using (PerformanceCounter performanceCounter = new PerformanceCounter(".NET CLR Memory", "Process ID", process.ProcessName, true))
    {
        Console.WriteLine(performanceCounter.CounterHelp);
    }
}
Другие вопросы по тегам