PerformanceCounterCategory Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет объект производительности, определяющий категорию счетчиков производительности.
public ref class PerformanceCounterCategory sealed
public sealed class PerformanceCounterCategory
type PerformanceCounterCategory = class
Public NotInheritable Class PerformanceCounterCategory
- Наследование
-
PerformanceCounterCategory
Примеры
В следующем примере кода определяется, существует ли он PerformanceCounterPerformanceCounterCategory на локальном компьютере или на другом компьютере. Если эти объекты не существуют на локальном компьютере, пример при необходимости создает их. Он использует Exists метод, чтобы определить, существует ли существует PerformanceCounterCategory . PerformanceCounterCategory Если имя счетчика не существует и имя счетчика не указано, или если компьютер является удаленным компьютером, пример завершает работу.
PerformanceCounter Если указано имя, в примере используется CounterExists метод и отображается результат для пользователя. PerformanceCounter Если он не существует, пользователь может удалить и повторно создать его PerformanceCounterCategory с помощью новогоPerformanceCounter. Если пользователь делает это, категория удаляется с помощью Delete метода.
При запросе в примере создается новое PerformanceCounterCategory и PerformanceCounter используется Create метод. Если указано имя экземпляра, в примере используется InstanceExists метод и отображается результат.
using System;
using System.Diagnostics;
using Microsoft.VisualBasic;
class PerfCounterCatCreateExistMod
{
public static void Main(string[] args)
{
string categoryName = "";
string counterName = "";
string instanceName = "";
string machineName = "";
string categoryHelp = "";
string counterHelp = "";
bool objectExists = false;
PerformanceCounterCategory pcc;
bool createCategory = false;
// Copy the supplied arguments into the local variables.
try
{
categoryName = args[0];
counterName = args[1];
instanceName = args[2];
machineName = args[3]=="."? "": args[3];
categoryHelp = args[4];
counterHelp = args[5];
}
catch(Exception ex)
{
// Ignore the exception from non-supplied arguments.
}
// Verify that the category name is not blank.
if (categoryName.Length==0)
{
Console.WriteLine("Category name cannot be blank.");
return;
}
// Check whether the specified category exists.
if (machineName.Length==0)
{
objectExists = PerformanceCounterCategory.Exists(categoryName);
}
else
{
// Handle the exception that is thrown if the computer
// cannot be found.
try
{
objectExists = PerformanceCounterCategory.Exists(categoryName, machineName);
}
catch(Exception ex)
{
Console.WriteLine("Error checking for existence of " +
"category \"{0}\" on computer \"{1}\":"+"\n" +ex.Message, categoryName, machineName);
return;
}
}
// Tell the user whether the specified category exists.
Console.WriteLine("Category \"{0}\" "+ (objectExists? "exists on ": "does not exist on ")+
(machineName.Length>0? "computer \"{1}\".": "this computer."), categoryName, machineName);
// If no counter name is given, the program cannot continue.
if (counterName.Length==0)
{
return;
}
// A category can only be created on the local computer.
if (!objectExists)
{
if (machineName.Length>0)
{
return;
}
else
{
createCategory = true;
}
}
else
{
// Check whether the specified counter exists.
if (machineName.Length==0)
{
objectExists = PerformanceCounterCategory.CounterExists(counterName, categoryName);
}
else
{
objectExists = PerformanceCounterCategory.CounterExists(counterName, categoryName, machineName);
}
// Tell the user whether the counter exists.
Console.WriteLine("Counter \"{0}\" "+(objectExists? "exists": "does not exist")+
" in category \"{1}\" on "+(machineName.Length>0? "computer \"{2}\".": "this computer."),
counterName, categoryName, machineName);
// If the counter does not exist, consider creating it.
if (!objectExists)
// If this is a remote computer,
// exit because the category cannot be created.
{
if (machineName.Length>0)
{
return;
}
else
{
// Ask whether the user wants to recreate the category.
Console.Write("Do you want to delete and recreate " +
"category \"{0}\" with your new counter? [Y/N]: ", categoryName);
string userReply = Console.ReadLine();
// If yes, delete the category so it can be recreated later.
if (userReply.Trim().ToUpper()=="Y")
{
PerformanceCounterCategory.Delete(categoryName);
createCategory = true;
}
else
{
return;
}
}
}
}
// Create the category if it was deleted or it never existed.
if (createCategory)
{
pcc = PerformanceCounterCategory.Create(categoryName, categoryHelp, counterName, counterHelp);
Console.WriteLine("Category \"{0}\" with counter \"{1}\" created.", pcc.CategoryName, counterName);
}
else if(instanceName.Length>0)
{
if (machineName.Length==0)
{
objectExists = PerformanceCounterCategory.InstanceExists(instanceName, categoryName);
}
else
{
objectExists = PerformanceCounterCategory.InstanceExists(instanceName, categoryName, machineName);
}
// Tell the user whether the instance exists.
Console.WriteLine("Instance \"{0}\" "+(objectExists? "exists": "does not exist")+
" in category \"{1}\" on " + (machineName.Length>0? "computer \"{2}\".": "this computer."),
instanceName, categoryName, machineName);
}
}
}
Imports System.Diagnostics
Module PerfCounterCatCreateExistMod
Sub Main(ByVal args() As String)
Dim categoryName As String = ""
Dim counterName As String = ""
Dim instanceName As String = ""
Dim machineName As String = ""
Dim categoryHelp As String = ""
Dim counterHelp As String = ""
Dim objectExists As Boolean = False
Dim pcc As PerformanceCounterCategory
Dim createCategory As Boolean = False
' Copy the supplied arguments into the local variables.
Try
categoryName = args(0)
counterName = args(1)
instanceName = args(2)
machineName = IIf(args(3) = ".", "", args(3))
categoryHelp = args(4)
counterHelp = args(5)
Catch ex As Exception
' Ignore the exception from non-supplied arguments.
End Try
' Verify that the category name is not blank.
If categoryName.Length = 0 Then
Console.WriteLine("Category name cannot be blank.")
Return
End If
' Check whether the specified category exists.
If machineName.Length = 0 Then
objectExists = _
PerformanceCounterCategory.Exists(categoryName)
Else
' Handle the exception that is thrown if the computer
' cannot be found.
Try
objectExists = PerformanceCounterCategory.Exists( _
categoryName, machineName)
Catch ex As Exception
Console.WriteLine("Error checking for existence of " & _
"category ""{0}"" on computer ""{1}"":" & vbCrLf & _
ex.Message, categoryName, machineName)
Return
End Try
End If
' Tell the user whether the specified category exists.
Console.WriteLine("Category ""{0}"" " & _
IIf(objectExists, "exists on ", "does not exist on ") & _
IIf(machineName.Length > 0, _
"computer ""{1}"".", "this computer."), _
categoryName, machineName)
' If no counter name is given, the program cannot continue.
If counterName.Length = 0 Then
Return
End If
' A category can only be created on the local computer.
If Not objectExists Then
If machineName.Length > 0 Then
Return
Else
createCategory = True
End If
Else
' Check whether the specified counter exists.
If machineName.Length = 0 Then
objectExists = PerformanceCounterCategory.CounterExists( _
counterName, categoryName)
Else
objectExists = PerformanceCounterCategory.CounterExists( _
counterName, categoryName, machineName)
End If
' Tell the user whether the counter exists.
Console.WriteLine("Counter ""{0}"" " & _
IIf(objectExists, "exists", "does not exist") & _
" in category ""{1}"" on " & _
IIf(machineName.Length > 0, _
"computer ""{2}"".", "this computer."), _
counterName, categoryName, machineName)
' If the counter does not exist, consider creating it.
If Not objectExists Then
' If this is a remote computer,
' exit because the category cannot be created.
If machineName.Length > 0 Then
Return
Else
' Ask whether the user wants to recreate the category.
Console.Write("Do you want to delete and recreate " & _
"category ""{0}"" with your new counter? [Y/N]: ", _
categoryName)
Dim userReply As String = Console.ReadLine()
' If yes, delete the category so it can be recreated later.
If userReply.Trim.ToUpper.Chars(0) = "Y" Then
PerformanceCounterCategory.Delete(categoryName)
createCategory = True
Else
Return
End If
End If
End If
End If
' Create the category if it was deleted or it never existed.
If createCategory Then
pcc = PerformanceCounterCategory.Create( _
categoryName, categoryHelp, counterName, counterHelp)
Console.WriteLine( _
"Category ""{0}"" with counter ""{1}"" created.", _
pcc.CategoryName, counterName)
ElseIf instanceName.Length > 0 Then
' If an instance name was given, check whether it exists.
If machineName.Length = 0 Then
objectExists = PerformanceCounterCategory.InstanceExists( _
instanceName, categoryName)
Else
objectExists = PerformanceCounterCategory.InstanceExists( _
instanceName, categoryName, machineName)
End If
' Tell the user whether the instance exists.
Console.WriteLine("Instance ""{0}"" " & _
IIf(objectExists, "exists", "does not exist") & _
" in category ""{1}"" on " & _
IIf(machineName.Length > 0, _
"computer ""{2}"".", "this computer."), _
instanceName, categoryName, machineName)
End If
End Sub
End Module
Комментарии
Это важно
Для создания или удаления счетчика производительности требуется синхронизация базового кода с помощью именованного мьютекса. Если приложение с высоким уровнем привилегий блокирует именованный мьютекс, пытается создать или удалить счетчик производительности, приложение перестанет отвечать до тех пор, пока блокировка не будет освобождена. Чтобы избежать этой проблемы, никогда не предоставьте UnmanagedCode разрешения ненадежным кодам. Кроме того, UnmanagedCode разрешение потенциально позволяет обходить другие разрешения и предоставлять только высоконадежный код.
Свойство PerformanceCounterCategory экземпляра отображается в поле "Объект производительности" CategoryName диалогового окна "Добавление счетчика производительности" приложения "Средство просмотра производительности".
Класс PerformanceCounterCategory предоставляет несколько методов взаимодействия с счетчиками и категориями на компьютере. Методы позволяют определять пользовательские Create категории. Этот Delete метод предоставляет способ удаления категорий с компьютера. Метод GetCategories позволяет просматривать список категорий, извлекая ReadCategory все данные счетчика и экземпляра, связанные с одной категорией.
Счетчик производительности публикует данные о производительности приложения. Категории включают физические компоненты (такие как процессоры, диски и память) и системные объекты (такие как процессы и потоки). Системные счетчики, связанные с тем же объектом производительности, группируются в категорию, которая указывает на их общий фокус. При создании экземпляра PerformanceCounter класса сначала указывается категория, с которой будет взаимодействовать компонент, а затем вы выбираете счетчик из этой категории.
Например, одна категория счетчиков Windows — категория памяти. Системные счетчики в этой категории отслеживают данные памяти, такие как количество доступных байтов и количество кэшированных байтов. Если вы хотите работать с кэшируемыми в приложении байтами, создайте экземпляр PerformanceCounter компонента, подключите его к категории памяти и выберите соответствующий счетчик (в данном случае кэшированные байты) из этой категории.
Хотя ваша система делает гораздо больше категорий счетчиков доступными, категории, которые, вероятно, будут взаимодействовать с наиболее часто кэшем, памятью, объектами, physicalDisk, Process, Processor, Server, System и Thread категорий.
Это важно
Метод RemoveInstance в PerformanceCounter классе освобождает счетчик и, если для этой категории выбран параметр повторного использования, экземпляр счетчика будет использоваться повторно. Это может привести к состоянию гонки, если другой процесс или даже другая часть кода пытается записать в экземпляр счетчика.
Замечание
Настоятельно рекомендуется создавать новые категории счетчиков производительности во время установки приложения, а не во время выполнения приложения. Это позволит операционной системе обновить список зарегистрированных категорий счетчиков производительности. Если список не был обновлен, попытка использовать категорию завершится ошибкой.
Замечание
Категории счетчиков производительности, установленные с помощью .NET, используют отдельную общую память, при этом каждая категория счетчиков производительности имеет собственную память. Размер отдельной общей памяти можно указать, создав DWORD с именем FileMappingSize в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<имени> категории\Performance. Значение FileMappingSize имеет общий размер памяти категории. Размер по умолчанию — 131072 десятичное значение. Если значение FileMappingSize отсутствует, используется значение атрибута для элемента, fileMappingSize указанного performanceCounters в файле Machine.config, что приводит к дополнительным затратам на обработку файлов конфигурации. Вы можете реализовать улучшение производительности запуска приложения, задав размер сопоставления файлов в реестре. Дополнительные сведения о размере сопоставления файлов см. в разделе <PerformanceCounters>.
Конструкторы
| Имя | Описание |
|---|---|
| PerformanceCounterCategory() |
Инициализирует новый экземпляр PerformanceCounterCategory класса, оставляет CategoryName свойство пустым и задает MachineName свойство локальному компьютеру. |
| PerformanceCounterCategory(String, String) |
Инициализирует новый экземпляр PerformanceCounterCategory класса и задает CategoryNameMachineName свойства указанным значениям. |
| PerformanceCounterCategory(String) |
Инициализирует новый экземпляр PerformanceCounterCategory класса, задает CategoryName свойство указанному значению и задает MachineName свойство локальному компьютеру. |
Свойства
| Имя | Описание |
|---|---|
| CategoryHelp |
Возвращает текст справки категории. |
| CategoryName |
Возвращает или задает имя объекта производительности, определяющего эту категорию. |
| CategoryType |
Возвращает тип категории счетчика производительности. |
| MachineName |
Возвращает или задает имя компьютера, на котором существует эта категория. |
Методы
| Имя | Описание |
|---|---|
| CounterExists(String, String, String) |
Определяет, зарегистрирован ли указанный счетчик в указанной категории на удаленном компьютере. |
| CounterExists(String, String) |
Определяет, зарегистрирован ли указанный счетчик в указанной категории на локальном компьютере. |
| CounterExists(String) |
Определяет, зарегистрирован ли указанный счетчик в этой категории, который указывается свойствами и MachineName свойствамиCategoryName. |
| Create(String, String, CounterCreationDataCollection) |
Устаревшие..
Устаревшие..
Устаревшие..
Регистрирует пользовательскую категорию счетчиков производительности, содержащую указанные счетчики на локальном компьютере. |
| Create(String, String, PerformanceCounterCategoryType, CounterCreationDataCollection) |
Регистрирует пользовательскую категорию счетчиков производительности, содержащую указанные счетчики на локальном компьютере. |
| Create(String, String, PerformanceCounterCategoryType, String, String) |
Регистрирует пользовательскую категорию счетчика производительности, содержащую один счетчик типа NumberOfItems32 на локальном компьютере. |
| Create(String, String, String, String) |
Устаревшие..
Устаревшие..
Устаревшие..
Регистрирует пользовательскую категорию счетчика производительности, содержащую один счетчик типа |
| Delete(String) |
Удаляет категорию и связанные счетчики с локального компьютера. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| Exists(String, String) |
Определяет, зарегистрирована ли категория на указанном компьютере. |
| Exists(String) |
Определяет, зарегистрирована ли категория на локальном компьютере. |
| GetCategories() |
Извлекает список категорий счетчиков производительности, зарегистрированных на локальном компьютере. |
| GetCategories(String) |
Извлекает список категорий счетчиков производительности, зарегистрированных на указанном компьютере. |
| GetCounters() |
Извлекает список счетчиков в категории счетчиков производительности, содержащей ровно один экземпляр. |
| GetCounters(String) |
Извлекает список счетчиков в категории счетчиков производительности, содержащей один или несколько экземпляров. |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetInstanceNames() |
Извлекает список экземпляров объектов производительности, связанных с этой категорией. |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| InstanceExists(String, String, String) |
Определяет, содержит ли указанная категория на указанном компьютере указанный экземпляр объекта производительности. |
| InstanceExists(String, String) |
Определяет, содержит ли указанная категория на локальном компьютере указанный экземпляр объекта производительности. |
| InstanceExists(String) |
Определяет, существует ли указанный экземпляр объекта производительности в категории, определяемой свойством этого PerformanceCounterCategory объекта CategoryName . |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| ReadCategory() |
Считывает все данные экземпляра объекта счетчика и производительности, связанные с этой категорией счетчиков производительности. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |