PerformanceCounterCategory Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет объект производительности, который определяет категорию счетчиков производительности.
public ref class PerformanceCounterCategory sealed
public sealed class PerformanceCounterCategory
type PerformanceCounterCategory = class
Public NotInheritable Class PerformanceCounterCategory
- Наследование
-
PerformanceCounterCategory
Примеры
В следующем примере кода определяется, существует ли PerformanceCounter объект и на PerformanceCounterCategory локальном компьютере или на другом компьютере. Если эти объекты не существуют на локальном компьютере, их при необходимости создает пример. Он использует метод , 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 отображается в поле Объект производительности диалогового окна Добавление счетчика приложения Performance Viewer.
Класс PerformanceCounterCategory предоставляет несколько методов для взаимодействия со счетчиками и категориями на компьютере. Методы Create позволяют определять пользовательские категории. Метод Delete предоставляет способ удаления категорий с компьютера. Метод GetCategories позволяет просматривать список категорий, извлекая ReadCategory все данные счетчика и экземпляра, связанные с одной категорией.
Счетчик производительности публикует данные о производительности приложения. Категории включают физические компоненты (например, процессоры, диски и память) и системные объекты (например, процессы и потоки). Системные счетчики, связанные с тем же объектом производительности, группируются в категорию, указывающую их общую направленность. При создании экземпляра PerformanceCounter класса сначала указывается категория, с которой будет взаимодействовать компонент, а затем выбирается счетчик из этой категории.
Например, одной из категорий счетчиков Windows является категория Память. Системные счетчики в этой категории отслеживают данные памяти, такие как количество доступных байтов и количество кэшированных байтов. Если вы хотите работать с кэшируемыми в приложении байтами, создайте экземпляр PerformanceCounter компонента, подключите его к категории Память, а затем выберите соответствующий счетчик (в данном случае кэшированные байты) из этой категории.
Хотя в системе доступно гораздо больше категорий счетчиков, наиболее часто будут взаимодействовать категории Кэш, Память, Объекты, Физический диск, Процесс, Процессор, Сервер, Система и Поток.
Важно!
Метод RemoveInstance в PerformanceCounter классе освобождает счетчик, и если для этой категории выбран параметр повторного использования, экземпляр счетчика будет использоваться повторно. Это может привести к возникновению состояния гонки, если другой процесс или даже другая часть кода пытается выполнить запись в экземпляр счетчика.
Примечание
Настоятельно рекомендуется создавать новые категории счетчиков производительности во время установки приложения, а не во время его выполнения. Это позволяет операционной системе обновить список зарегистрированных категорий счетчиков производительности. Если список не был обновлен, попытка использовать категорию завершится ошибкой.
Примечание
Категории счетчиков производительности, установленные с платформа .NET Framework 2.0, используют отдельную общую память, при этом каждая категория счетчика производительности имеет собственную память. Вы можете указать размер отдельной общей памяти, создав DWORD с именем FileMappingSize в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<имя> категории\Производительность. Для параметра FileMappingSize задан размер общей памяти категории. Размер по умолчанию — 131072 десятичное число. Если значение FileMappingSize отсутствует, fileMappingSize
используется значение атрибута для performanceCounters
элемента, указанного в файле Machine.config, что приводит к дополнительным издержкам для обработки файла конфигурации. Вы можете повысить производительность при запуске приложения, задав размер сопоставления файлов в реестре. Дополнительные сведения о размере сопоставления файлов см. в разделе <performanceCounters>.
Конструкторы
PerformanceCounterCategory() |
Инициализирует новый экземпляр класса PerformanceCounterCategory, оставляет пустым свойство CategoryName и задает в качестве значения свойства MachineName локальный компьютер. |
PerformanceCounterCategory(String) |
Инициализирует новый экземпляр класса PerformanceCounterCategory, задает для свойства CategoryName указанное значение, а в качестве значения свойства MachineName устанавливает локальный компьютер. |
PerformanceCounterCategory(String, String) |
Инициализирует новый экземпляр класса PerformanceCounterCategory и присваивает свойствам CategoryName и MachineName указанные значения. |
Свойства
CategoryHelp |
Возвращает текст справки для данной категории. |
CategoryName |
Получает или задает имя объекта производительности, который определяет эту категорию. |
CategoryType |
Возвращает тип категории счетчика производительности. |
MachineName |
Получает или задает имя компьютера, на котором находится эта категория. |
Методы
CounterExists(String) |
Определяет, является ли заданный счетчик зарегистрированным в категории, на которую указывают свойства CategoryName и MachineName. |
CounterExists(String, String) |
Определяет, зарегистрирован ли заданный счетчик в указанной категории на локальном компьютере. |
CounterExists(String, String, String) |
Определяет, зарегистрирован ли заданный счетчик в указанной категории на удаленном компьютере. |
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) |
Определяет, зарегистрирована ли категория на локальном компьютере. |
Exists(String, String) |
Определяет, зарегистрирована ли категория на указанном компьютере. |
GetCategories() |
Извлекает список категорий счетчиков производительности, зарегистрированных на локальном компьютере. |
GetCategories(String) |
Извлекает список категорий счетчиков производительности, зарегистрированных на заданном компьютере. |
GetCounters() |
Извлекает список счетчиков в категории счетчиков производительности, содержащей только один экземпляр. |
GetCounters(String) |
Извлекает список счетчиков в категории счетчиков производительности, содержащей один или несколько экземпляров. |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetInstanceNames() |
Извлекает список экземпляров объекта производительности, связанных с данной категорией. |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
InstanceExists(String) |
Определяет, существует ли указанный экземпляр объекта производительности в категории, определяемой свойством PerformanceCounterCategory объекта CategoryName. |
InstanceExists(String, String) |
Определяет, содержит ли указанная категория заданный экземпляр объекта производительности на локальном компьютере. |
InstanceExists(String, String, String) |
Определяет, содержит ли указанная категория на заданном компьютере заданный экземпляр объекта производительности. |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ReadCategory() |
Считывает все счетчики и данные экземпляра объекта производительности, связанные с этой категорией счетчиков производительности. |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |