PerformanceCounterCategory Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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 |
| 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) |