为什么“.NET CLR 内存”类别中的 "Process ID" 计数器始终为零?

Why is the "Process ID" counter in ".NET CLR Memory" category constantly zero?

在“.NET CLR Memory”性能计数器类别下,有一个名为“进程 ID”的计数器。此计数器的任何给定实例都应该 return 与该实例关联的 Windows 进程的进程 ID。对于我自己的流程,此计数器的值始终为零。这是为什么?

如果我查看计数器的 devenv 实例,它 return 是预期值 - 至少,该值与任务管理器报告的进程 ID 匹配。

如果我 运行 我自己的应用程序处于调试模式并检查计数器的 PerfCounterTest.vshost 实例,它的值永远只有零。

如果我 运行 我自己的应用程序没有调试器,PerfCounterTest 实例总是零。

如果我 运行 我自己的应用程序的多个实例,序列号实例 PerfCounterTest#1PerfCounterTest#2 ... 的值都为零。

为什么这个计数器始终为零,既然它始终为零,我如何找到与我的进程关联的实例名称,同时记住它可能没有唯一的名称?

碰巧的是,在与该实例关联的进程中发生第一次垃圾回收之前,该计数器的一个实例的值为零。

这一事实记录在与“进程 ID”计数器关联的计数器帮助文本中:

This counter displays the process ID of the CLR process instance being monitored. The value displayed will be 0 until after the first garbage collection.

之所以晦涩难懂,是因为尽管您可以使用 System.Diagnostics 命名空间中的内容轻松阅读本文,但没有关于此事的其他文档。我搜索了 MSDN、TechNet 和网络,但一无所获。即使在找到答案之后,我还是打开了 PerfMon 并试图在 U.I 中找到这个字符串。 - 据我所知,它没有显示在任何地方。

以下是查询柜台帮助文本的方式,以供日后参考:

using (Process process = Process.GetCurrentProcess())
{
    using (PerformanceCounter performanceCounter = new PerformanceCounter(".NET CLR Memory", "Process ID", process.ProcessName, true))
    {
        Console.WriteLine(performanceCounter.CounterHelp);
    }
}