Почему счетчик "Идентификатор процесса" в категории ".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);
}
}