PerformanceCounterCategory class
同时具有constructor和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
如果我使用“创建”方法,则不会引发任何异常(忽略此问题的计数器名称)。
我在文档中没有发现任何暗示这种行为的信息。
这是故意的,还是在使用constructor
时我缺少了什么?另外,使用构造函数和create方法之间有什么区别?
答案 0 :(得分:1)
使用Windows性能计数器的一个常见问题是希望根据需要即时创建它们,每次新运行都会创建适合该代码版本的任何计数器。
Windows性能计数器是很久很久以前设计和实现的,因此,它们打算在某种安装过程中进行注册。那时,所有具有重要意义的软件在首次安装和任何更新期间都经过用户启动的安装过程。实际上,注册性能计数器类别及其对应的计数器的操作需要相当高的特权(例如,您不能在具有默认特权的IIS下进行此操作)。该系统也不允许即时更改计数器。这样做的好处是,客户端可以查询可用的计数器,并知道它们在收集计数器时不会更改(至少在关联进程运行时)。如果您希望某些可以动态更改的东西,则必须自己动手(这并不难,除非您希望它们显示在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
采用计算机名称的构造函数是充当 client 来从另一台计算机收集统计信息。
还请记住,程序中可以有多少个性能计数器是有限制的,并且还需要特殊的网络特权才能查询这些值。限制取决于计数器名称和帮助的大小及其值,并且很难更改,因此您可能要避免遇到这种情况(根据经验,我可以告诉您,这样做时,各种计数器会超出限制似乎都具有相同的值)。尽管有这些限制,但它们在许多情况下还是很有用的。