PerformanceCounterCategory Classe

Definição

Representa um objeto de performance, que define uma categoria de contadores de performance.

public ref class PerformanceCounterCategory sealed
public sealed class PerformanceCounterCategory
type PerformanceCounterCategory = class
Public NotInheritable Class PerformanceCounterCategory
Herança
PerformanceCounterCategory

Exemplos

O seguinte exemplo de código determina se a PerformanceCounter e its PerformanceCounterCategory existem no computador local ou noutro computador. Se estes objetos não existirem no computador local, o exemplo cria-os opcionalmente. Utiliza o Exists método para determinar se o PerformanceCounterCategory existe. Se o PerformanceCounterCategory não existir e não for especificado o nome do contador, ou se o computador for uma máquina remota, o exemplo sai.

Se for fornecido um PerformanceCounter nome, o exemplo utiliza o CounterExists método e apresenta o resultado ao utilizador. Se o PerformanceCounter não existir, o utilizador pode eliminar e recriar o PerformanceCounterCategory com o novo PerformanceCounter. Se o utilizador o fizer, a categoria é eliminada usando o Delete método.

Se solicitado, o exemplo cria agora o novo PerformanceCounterCategory e PerformanceCounter usando o Create método. Se for especificado um nome de instância, o exemplo utiliza o InstanceExists método e apresenta o resultado.

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

Observações

Importante

Criar ou eliminar um contador de desempenho requer a sincronização do código subjacente usando um mutex nomeado. Se uma aplicação altamente privilegiada bloquear o mutex nomeado, as tentativas de criar ou eliminar um contador de desempenho fazem com que a aplicação deixe de responder até que o bloqueio seja libertado. Para ajudar a evitar este problema, nunca conceda UnmanagedCode permissão a código não confiável. Além disso, UnmanagedCode a permissão permite potencialmente que outras permissões sejam contornadas e só deve ser concedida a código altamente confiável.

A PerformanceCounterCategory propriedade da CategoryName instância é exibida no campo Performance Object da caixa de diálogo Add Counter da aplicação Performance Viewer.

A PerformanceCounterCategory aula fornece vários métodos para interagir com contadores e categorias no computador. Os Create métodos permitem-lhe definir categorias personalizadas. O Delete método permite remover categorias do computador. O GetCategories método permite-lhe visualizar a lista de categorias, enquanto ReadCategory recupera todos os dados de contadores e instâncias associados a uma única categoria.

Um contador de desempenho publica dados de desempenho sobre uma aplicação. As categorias incluem componentes físicos (como processadores, discos e memória) e objetos do sistema (como processos e threads). Os contadores do sistema relacionados com o mesmo objeto de desempenho são agrupados numa categoria que indica o seu foco comum. Quando crias uma instância da PerformanceCounter classe, primeiro indicas a categoria com a qual o componente irá interagir e depois escolhes um contador dessa categoria.

Por exemplo, uma categoria contador do Windows é a categoria Memória. Os contadores de sistema dentro desta categoria acompanham dados de memória, como o número de bytes disponíveis e o número de bytes em cache. Se quiser trabalhar com os bytes armazenados em cache na sua aplicação, criaria uma instância do PerformanceCounter componente, ligava-a à categoria Memória e depois escolhia o contador apropriado (neste caso, Bytes em Cache) dessa categoria.

Embora o seu sistema disponibilize muitas mais contracategorias, as categorias com que provavelmente irá interagir com mais frequência são as categorias Cache, Memória, Objetos, PhysicalDisk, Processo, Processador, Servidor, Sistema e Thread.

Importante

O RemoveInstance método na PerformanceCounter classe libertará o contador e, se a opção de reutilização for selecionada para essa categoria, a instância do contador será reutilizada. Isto pode causar uma condição de corrida se outro processo ou até outra parte do código estiver a tentar escrever na instância contadora.

Note

É fortemente recomendado que novas categorias de contadores de desempenho sejam criadas durante a instalação da aplicação, e não durante a execução da aplicação. Isto permite que o sistema operativo atualize a sua lista de categorias de contadores de desempenho registadas. Se a lista não tiver sido atualizada, a tentativa de usar a categoria falhará.

Note

As categorias de contadores de desempenho instaladas com .NET usam memória partilhada separada, sendo que cada categoria de contador de desempenho tem a sua própria memória. Pode especificar o tamanho da memória partilhada separada criando um DWORD chamado FileMappingSize na chave do registo HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<nome> da categoria\Performance. O valor FileMappingSize é definido para o tamanho da memória partilhada da categoria. O tamanho padrão é 131072 decimal. Se o valor FileMappingSize não estiver presente, o fileMappingSize valor do atributo para o performanceCounters elemento especificado no ficheiro de Machine.config é utilizado, causando sobrecarga adicional para o processamento de ficheiros de configuração. Pode obter uma melhoria de desempenho no arranque da aplicação definindo o tamanho do mapeamento do ficheiro no registo. Para mais informações sobre o tamanho do mapeamento do ficheiro, consulte <performanceCounters>.

Construtores

Name Description
PerformanceCounterCategory()

Inicializa uma nova instância da PerformanceCounterCategory classe, deixa a CategoryName propriedade vazia e define a MachineName propriedade para o computador local.

PerformanceCounterCategory(String, String)

Inicializa uma nova instância da PerformanceCounterCategory classe e define as CategoryName propriedades e MachineName para os valores especificados.

PerformanceCounterCategory(String)

Inicializa uma nova instância da PerformanceCounterCategory classe, define a CategoryName propriedade para o valor especificado e define a MachineName propriedade para o computador local.

Propriedades

Name Description
CategoryHelp

Recebe o texto de ajuda da categoria.

CategoryName

Recebe ou define o nome do objeto de performance que define esta categoria.

CategoryType

Obtém o tipo de categoria de contador de desempenho.

MachineName

Obtém ou define o nome do computador onde esta categoria existe.

Métodos

Name Description
CounterExists(String, String, String)

Determina se o contador especificado está registado na categoria especificada num computador remoto.

CounterExists(String, String)

Determina se o contador especificado está registado na categoria especificada no computador local.

CounterExists(String)

Determina se o contador especificado está registado nesta categoria, o que é indicado pelas CategoryName propriedades e MachineName .

Create(String, String, CounterCreationDataCollection)
Obsoleto.

Regista a categoria de contador de desempenho personalizada contendo os contadores especificados no computador local.

Create(String, String, PerformanceCounterCategoryType, CounterCreationDataCollection)

Regista a categoria de contador de desempenho personalizada contendo os contadores especificados no computador local.

Create(String, String, PerformanceCounterCategoryType, String, String)

Regista a categoria de contador de desempenho personalizada contendo um único contador do tipo NumberOfItems32 no computador local.

Create(String, String, String, String)
Obsoleto.

Regista uma categoria personalizada de contador de desempenho contendo um único contador do tipo NumberOfItems32 no computador local.

Delete(String)

Remove a categoria e os seus contadores associados do computador local.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
Exists(String, String)

Determina se a categoria está registada no computador especificado.

Exists(String)

Determina se a categoria está registada no computador local.

GetCategories()

Recupera uma lista das categorias de contadores de desempenho registadas no computador local.

GetCategories(String)

Recupera uma lista das categorias de contadores de desempenho registadas no computador especificado.

GetCounters()

Recupera uma lista dos contadores numa categoria de contador de desempenho que contém exatamente uma instância.

GetCounters(String)

Recupera uma lista dos contadores numa categoria de contador de desempenho que contém uma ou mais instâncias.

GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetInstanceNames()

Recupera a lista de instâncias de objetos de desempenho associadas a esta categoria.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
InstanceExists(String, String, String)

Determina se uma categoria especificada num determinado computador contém a instância do objeto de desempenho especificada.

InstanceExists(String, String)

Determina se uma categoria especificada no computador local contém a instância do objeto de desempenho especificada.

InstanceExists(String)

Determina se a instância do objeto de desempenho especificada existe na categoria identificada pela propriedade deste PerformanceCounterCategoryCategoryName objeto.

MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
ReadCategory()

Lê todos os dados de contadores e instâncias de objetos de desempenho associados a esta categoria de contador de desempenho.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)

Aplica-se a

Ver também