我正在尝试确定我的进程在我编写的性能API中使用的线程数。我知道我可以使用Process.GetCurrentProcess.Threads
集合,但我一直在尝试将PerformanceCounter
用于我们想要监控的所有不同指标。
我已经能够使用以下计数器获得CPU处理时间:
this.counter = new PerformanceCounter();
counter.CategoryName = "Processor";
counter.CounterName = "% processor Time";
counter.InstanceName = "_Total";
现在我想跟踪当前进程的线程计数。我做了一些阅读,并将CategoryName
标识为来自MSDN article的主题:
虽然您的系统提供了更多可用的计数器类别,但您可能最常与之交互的类别是缓存,内存,对象,物理磁盘,进程,处理器,服务器,系统和线程类别。
但是当我使用Thread
值作为类别时,我会收到以下InvalidOperationException
:
找不到具有指定类别名称'Thread'的计数器计数器,计数器名称'Thread Count'
所以我将类别更改为Process并使用以下代码运行:
this.counter = new PerformanceCounter();
counter.CategoryName = "Process";
counter.CounterName = "Thread Count";
counter.InstanceName = "_Total";
这给了我2000以上的值,在某些情况下,我得到一个奇怪的小数值,考虑到你有一个线程或你没有。不是一个百分比。当我使用Process.GetCurrentProcess.Threads
时,我发现在使用计数器时我已经运行了15次,因此2,000+号码已经开始了。我做错了什么?
我正在使用性能监视器来识别可用的计数器,并尝试为每个计数器构建一个类,对于许多这些计数器。我有一个接口IMetric
,我想在后面实现十几个计数器。当我确定我想要的计数器时,如何确定我应该使用的CategoryName
的任何指导都会很棒。似乎使用类别,当我尝试使用它时,perfmon
中的计数器被分组,我尝试使用的类别也都没有。所有指标都适用于当前正在运行的流程,因此我的CategoryName
始终只是流程吗?
修改
当我在perfmon中使用线程计数计数器时,我看到大致正确的线程数(尽管分数仍然看起来很奇怪)。为什么当我使用这个计数器时,我看到2000+?如果我将InstanceName
更改为Process.GetCurrentProcess().ProcessName
,我会看到28到30之间的范围,这与perfmon给出的平均值不匹配。这似乎是一个更现实的数字。它仍然与Process.GetCurrentProcess().Threads
不匹配,我不确定它是否应该。