PerformanceCounterCategory 构造函数与创建方法

PerformanceCounterCategory constructor vs create method

PerformanceCounterCategory class has both a constructor and a 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

而如果我使用 "Create" 方法,则不会抛出异常(忽略此问题的计数器名称)。

我在文档中没有看到任何暗示这种行为的内容。

这是故意的还是我在使用 constructor 时遗漏了什么?另外使用constructor和create方法有什么区别?

使用 Windows 性能计数器的一个常见问题是希望根据需要即时创建它们,每个新的 运行 创建适合该版本代码的计数器.

Windows 性能计数器是很久很久以前设计和实现的,因此旨在在某种安装过程中进行注册。那时,所有重要的软件在首次安装和任何更新期间都要经过用户启动的安装过程。实际上,注册性能计数器类别及其对应计数器的行为需要相当高的权限(例如,您不能在 IIS 下使用默认权限执行此操作)。无论如何,系统也不允许即时更改计数器。这样做的好处是,客户端可以查询可用的计数器,并且知道它们在收集它们时不会更改(至少在相关进程处于 运行ning 时)。如果你想要一些可以动态改变的东西,你必须自己动手(这并不难,除非你想让它们出现在 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

带有机器名的构造函数是作为客户端从另一台机器收集统计信息。

另外请记住,您的程序中可以有多少个性能计数器是有限制的,而且查询这些值也需要特殊的网络权限。限制取决于计数器名称和帮助的大小,以及它们的值,并且很难更改,因此您可能希望避免达到该限制(根据经验,我可以告诉您,当您这样做时,各种计数器都会超过limit 似乎都具有相同的值)。尽管有这些限制,它们在许多情况下还是非常有用的。