如何:创建自定义性能计数器
更新:2007 年 11 月
创建新计数器时,应首先创建类别,然后指定要在其中包含的一个或多个计数器。可以通过以下方式之一来进行:
可以使用“服务器资源管理器”在设计时创建一个或多个计数器。
可以用 CounterCreationData 类以编程方式创建一个或多个计数器,然后将它们添加到 CounterCreationDataCollection 类型的集合中,并将该集合作为 Create 方法的特殊形式的参数进行传递。
也可以使用 PerformanceCounterCategory 类的 Create 方法在一个新类别中创建单个计数器。有关更多信息,请参见 如何:创建性能计数器类别。
创建计数器和类别时,应考虑两个特殊的问题。首先,不能在远程计算机上创建自定义的类别和计数器。其次,您与自定义计数器和类别的交互仅限于只读模式,除非您显式地另行指定。在只读模式下,不能对其进行增减或在其中设置原始值或其他值。您可以使用 ReadOnly 属性将自定义计数器设置为可写模式。
一定要注意创建计数器与创建 PerformanceCounter 组件的实例之间的区别。创建计数器是在 Windows 操作系统中创建一个新的类别及其相关计数器,而不是在您的项目或应用程序中创建组件。在创建 PerformanceCounter 组件的实例时,将在 Visual Studio 项目内部创建一个引用外部计数器的组件。
说明: |
---|
有些安全限制会影响您使用性能计数器的能力。有关更多信息,请参见 监视性能阈值的介绍。 |
安全说明: |
---|
请注意,在创建性能计数器时,该资源可能已经存在。另一进程(可能是恶意进程)可能已创建了资源,并拥有对该资源的访问权。将数据放入性能计数器后,其他进程就可使用这些数据了。 |
说明: |
---|
Microsoft Windows NT 4.0 版不完全支持 PerformanceCounter 类。您可从系统计数器中读取,但不能创建、写入或删除自定义计数器。 |
说明: |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置。 |
在设计时创建新类别和自定义性能计数器
打开“服务器资源管理器”,展开要查看的服务器的节点。
说明: 如果所需的服务器没有列出,则必须添加该服务器。有关更多信息,请参见如何:访问和初始化服务器资源管理器/数据库资源管理器。
右击“性能计数器”节点并选择“创建新类别”。
将出现“性能计数器生成器”对话框。
说明: 若要访问性能计数器,您必须是具有对性能计数器的访问权的安全组(例如,“Performance Monitor Users”组)的成员。此外,当您试图执行需要提升权限的操作时,可能会收到 Windows Vista 上的相应提示,即使在管理权限下运行也是如此。有关更多信息,请参见 Windows Vista 和 Visual Studio。
为要创建的类别输入名称和说明。
说明: 如果指定现有类别的名称,将引发一个错误。若要覆盖现有的计数器类别,必须先用 Delete 方法删除该类别,然后添加新类别。
在“计数器列表生成器”框架中,执行以下操作:
单击“新建”按钮。
在“计数器”框架中,指定要在该类别中创建的计数器的名称。
从“类型”下拉列表中选择一个类型。
输入计数器的说明。
对于要在该类别中创建的每个计数器,重复步骤 4。
提示: 在退出对话框之前,可以在“计数器”列表中选择任一计数器,并编辑它们的值或者删除它们。
说明: 默认情况下,在该对话框中创建的计数器和类别支持读写功能,但除非另行指定,否则通过 PerformanceCounter 组件的实例与其进行的交互将限于只读模式。
编程创建新类别和性能计数器集
创建类型为 CounterCreationDataCollection 的集合。
将要创建的计数器作为 CounterCreationData 类型的对象进行创建,并设置它们的必需属性。
通过调用集合的 Add 方法向集合添加 CounterCreationData 对象。
调用 PerformanceCounterCategory 类的 Create 方法并将该集合传递给它。
下面的示例显示如何创建一系列计数器,并在创建类别时将它们传递到类别:
' Create a collection of type CounterCreationDataCollection. Dim CounterDatas As New CounterCreationDataCollection() ' Create the counters and set their properties. Dim cdCounter1 As New CounterCreationData() Dim cdCounter2 As New CounterCreationData() cdCounter1.CounterName = "MyCounter1" cdCounter1.CounterHelp = "help string" cdCounter1.CounterType = PerformanceCounterType.NumberOfItems64 cdCounter2.CounterName = "MyCounter2" cdCounter2.CounterHelp = "help string 2" cdCounter2.CounterType = PerformanceCounterType.NumberOfItems64 ' Add both counters to the collection. CounterDatas.Add(cdCounter1) CounterDatas.Add(cdCounter2) ' Create the category and pass the collection to it. PerformanceCounterCategory.Create("Multi Counter Category", _ "Category help", PerformanceCounterCategoryType.SingleInstance, _ CounterDatas)
// Create a collection of type CounterCreationDataCollection. System.Diagnostics.CounterCreationDataCollection CounterDatas = new System.Diagnostics.CounterCreationDataCollection(); // Create the counters and set their properties. System.Diagnostics.CounterCreationData cdCounter1 = new System.Diagnostics.CounterCreationData(); System.Diagnostics.CounterCreationData cdCounter2 = new System.Diagnostics.CounterCreationData(); cdCounter1.CounterName = "Counter1"; cdCounter1.CounterHelp = "help string1"; cdCounter1.CounterType = System.Diagnostics.PerformanceCounterType.NumberOfItems64; cdCounter2.CounterName = "Counter2"; cdCounter2.CounterHelp = "help string 2"; cdCounter2.CounterType = System.Diagnostics.PerformanceCounterType.NumberOfItems64; // Add both counters to the collection. CounterDatas.Add(cdCounter1); CounterDatas.Add(cdCounter2); // Create the category and pass the collection to it. System.Diagnostics.PerformanceCounterCategory.Create( "Multi Counter Category", "Category help", PerformanceCounterCategoryType.SingleInstance, CounterDatas);