Поделиться через


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)
Устаревшие..
Устаревшие..
Устаревшие..

Регистрирует пользовательскую категорию счетчиков производительности, содержащую на локальном компьютере один счетчик типа NumberOfItems32.

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)

Применяется к

См. также раздел