System.Diagnostics.PerformanceData Namespace

Use as classes nesse namespace para fornecer dados de contador. Os contadores são usados para expor as métricas de desempenho aos consumidores, como o Monitor de Desempenho. O namespace não contém classes para consumir os dados do contador. Para obter uma descrição completa da arquitetura de contadores de desempenho, confira Contadores de desempenho.

Classes

CounterData

Contém os dados brutos de um contador.

CounterSet

Define um conjunto de contadores lógicos.

CounterSetInstance

Cria uma instância dos contadores lógicos definidos na classe CounterSet.

CounterSetInstanceCounterDataSet

Contém a coleção de valores do contador.

Enumerações

CounterSetInstanceType

Especifica se o conjunto de contadores permite várias instâncias, como processos e discos físicos, ou uma única instância, como memória.

CounterType

Define os possíveis tipos de contadores. Cada contador recebe um tipo de contador. O tipo de contador determina como os dados do contador são calculados, têm a média calculada e são exibidos.

Exemplos

O seguinte mostra um manifesto simples:

<!-- <?xml version="1.0" encoding="UTF-16"?> -->  
<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd"   
     xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"   
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
     xmlns:xs="http://www.w3.org/2001/XMLSchema"   
     xmlns:trace=http://schemas.microsoft.com/win/2004/08/events/trace>  

    <instrumentation>  

        <counters xmlns=http://schemas.microsoft.com/win/2005/12/counters>  

            <provider  
              applicationIdentity = "provider1.exe"  
              providerType = "userMode"  
              providerGuid = "{51D1685C-35ED-45be-99FE-17261A4F27F3}">  

               <counterSet guid = "{582803C9-AACD-45e5-8C30-571141A22092}"  
                  uri = "Microsoft.Windows.System.PerfCounters.Typing"  
                  name = "$(string.CounterSet1.Name)"   
                  description = "$(string.CounterSet1.Description)"   
                  instances = "single">  

                    <counter id = "1"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.TotalWords"  
                      name = "$(string.CS1.Counter1.Name)"  
                      description = "$(string.CS1.Counter1.Description)"  
                      type = "perf_counter_rawcount"  
                      detailLevel = "standard"/>  

                    <counter id = "2"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.WordsInInterval"  
                      name = "$(string.CS1.Counter2.Name)"  
                      description = "$(string.CS1.Counter2.Description)"  
                      type = "perf_counter_delta"  
                      detailLevel = "standard"/>  

                    <counter id = "3"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.LetterAPressed"  
                      name = "$(string.CS1.Counter3.Name)"  
                      description = "$(string.CS1.Counter3.Description)"  
                      type = "perf_counter_rawcount"  
                      detailLevel = "standard"/>  

                    <counter id = "4"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.WordsContainingLetterA"  
                      name = "$(string.CS1.Counter4.Name)"   
                      description = "$(string.CS1.Counter4.Description)"   
                      type = "perf_counter_rawcount"  
                      detailLevel = "standard"/>  

                    <counter id = "5"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.PercentOfWordsContainingLetterA"  
                      name = "$(string.CS1.Counter5.Name)"   
                      description = "$(string.CS1.Counter5.Description)"   
                      type = "perf_sample_fraction"  
                      baseID = "6"  
                      detailLevel = "standard">  
                      <counterAttributes>  
                          <counterAttribute name = "displayAsReal" />  
                      </counterAttributes>  
                    </counter>  

                    <counter id = "6"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.PercentBase"  
                      type = "perf_sample_base"  
                      detailLevel = "standard">  
                      <counterAttributes>  
                          <counterAttribute name = "noDisplay" />  
                      </counterAttributes>  
                    </counter>  

                </counterSet>  
            </provider>  
        </counters>  
    </instrumentation>  

    <localization>  
        <resources culture="en-US">  
            <stringTable>  

                <string id="CounterSet1.Name" value="Typing"/>  
                <string id="CounterSet1.Description" value="Captures simple typing metrics."/>  
                <string id="CS1.Counter1.Name" value="Total Words Typed"/>   
                <string id="CS1.Counter1.Description" value="The total number of words typed."/>  
                <string id="CS1.Counter2.Name" value="Words Typed In Interval"/>   
                <string id="CS1.Counter2.Description" value="The total number of words typed in the interval."/>  
                <string id="CS1.Counter3.Name" value="Letter A Pressed"/>   
                <string id="CS1.Counter3.Description" value="The number of times that the letter A is pressed."/>  
                <string id="CS1.Counter4.Name" value="Words Containing A"/>   
                <string id="CS1.Counter4.Description" value="The number of words that contain the letter A."/>  
                <string id="CS1.Counter5.Name" value="Percent of Words Containing A"/>   
                <string id="CS1.Counter5.Description" value="The percent of words that contain the letter A in the last interval."/>  

            </stringTable>  
        </resources>  
    </localization>  
</instrumentationManifest>  

O seguinte mostra uma implementação de provedor simples para o manifesto:

using System.Diagnostics.PerformanceData;  

        private static Guid providerId = new Guid("{51D1685C-35ED-45be-99FE-17261A4F27F3}");  
        private static Guid typingCounterSetId = new Guid("{582803C9-AACD-45e5-8C30-571141A22092}");  

        private static CounterSet typingCounterSet;         // Defines the counter set  
        private static CounterSetInstance typingCsInstance; // Instance of the counter set  

        private static int numberOfLetterAInWord = 0;  

        . . .  

            // Create the 'Typing' counter set.  
            typingCounterSet = new CounterSet(providerId, typingCounterSetId, CounterSetInstanceType.Single);  

            // Add the counters to the counter set definition.  
            typingCounterSet.AddCounter(1, CounterType.RawData32, "Total Word Count");  
            typingCounterSet.AddCounter(2, CounterType.Delta32, "Words Typed In Interval");  
            typingCounterSet.AddCounter(3, CounterType.RawData32, "A Key Pressed");  
            typingCounterSet.AddCounter(4, CounterType.RawData32, "Words Containing A");  
            typingCounterSet.AddCounter(5, CounterType.SampleFraction, "Percent of Words Containing A");  
            typingCounterSet.AddCounter(6, CounterType.SampleBase, "Percent Base");  

            // Create an instance of the counter set (contains the counter data).  
            typingCsInstance = typingCounterSet.CreateCounterSetInstance("Typing Instance");  
            typingCsInstance.Counters[1].Value = 0;  
            typingCsInstance.Counters[2].Value = 0;  
            typingCsInstance.Counters[3].Value = 0;  
            typingCsInstance.Counters[4].Value = 0;  
            typingCsInstance.Counters[5].Value = 0;  
            typingCsInstance.Counters[6].Value = 0;  

        . . .  

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
        {  
            typingCounterSet.Dispose();  
        }  

        // Simple effort to capture letter A key press and words typed.  
        private void textInput_KeyDown(object sender, KeyEventArgs e)  
        {  
            Keys keyData = e.KeyData;  

            switch (e.KeyData)  
            {  
                case Keys.A :  
                    // In the .NET 3.5 Framework, you had to use the
                    // Value property to set and increment the counter   
                    // value. Beginning with the .NET 4.0 Framework,   
                    // the Value property is safe to use in a multi-  
                    // threaded application.  
                    typingCsInstance.Counters["A Key Pressed"].Value++;  
                    numberOfLetterAInWord++;  

                    break;  

                case Keys.Enter:  
                case Keys.Space:  
                case Keys.Tab:  

                    if (numberOfLetterAInWord > 0)  
                    {  
                        // Beginning with the .NET 4.0 Framework, you   
                        // can use the Increment method to increment   
                        // the counter value by 1. The Increment method   
                        // is safe to use in a multi-threaded   
                        // application.  
                        typingCsInstance.Counters["Words Containing A"].Increment();  
                        typingCsInstance.Counters["Percent of Words Containing A"].Increment();  
                        numberOfLetterAInWord = 0;  
                    }  

                    typingCsInstance.Counters["Percent Base"].Increment();  
                    typingCsInstance.Counters["Total Word Count"].Increment();  
                    typingCsInstance.Counters["Words Typed In Interval"].Increment();  

                    break;  
            }  
        }  

Comentários

As classes nesse namespace dão suporte à nova arquitetura (versão 2.0) para contadores de desempenho introduzidos no Windows Vista. Na nova arquitetura, o provedor não responde mais diretamente às solicitações do consumidor, mas simplesmente mantém os dados do contador. O sistema injeta um thread no processo do provedor quando o provedor cria uma instância do conjunto de contadores; o thread é responsável por lidar com solicitações do consumidor.

As etapas a seguir mostram o processo para escrever um provedor de contadores.

  1. Os contadores que o provedor fornece são definidos em um manifesto baseado em XML. Os contadores são agrupados logicamente em conjuntos de contadores. Os contadores dentro de um conjunto de contadores são identificados por um identificador numérico exclusivo dentro do conjunto de contadores. Um provedor pode definir um ou mais conjuntos de contadores. Um conjunto de contadores é identificado por um Guid exclusivo de um provedor. Observe que, se você usar essas classes para escrever seu provedor:

    • O atributo de retorno de chamada do elemento de provedor é ignorado.

    • O valor de referência do atributo name do elemento counterAttribute é ignorado.

    Para obter detalhes sobre como gravar o manifesto, consulte Esquema de contadores de desempenho.

  2. Depois de escrever o manifesto, use a ferramenta CTRPP para compilar o manifesto (ctrpp provider.man). A ferramenta gera quatro arquivos: .h, .c, .rc e *_r.h. Você pode ignorar os arquivos .h e .c. O arquivo .rc contém as cadeias de caracteres localizadas definidas no manifesto. Use os arquivos .rc e *_r.h para criar o arquivo de recurso compilado (.res) que você inclui em seu projeto. A chamada a seguir mostra como compilar o arquivo de recurso:

    rc /r /i "c:\Program Files\Microsoft SDKs\Windows\v6.0\Include" provider.rc  
    

    Se você receber um erro que referencie sal.h, copie o arquivo sal.h do Microsoft Visual Studio, o diretório de inclusão do Visual C para o diretório especificado para a opção /i.

    Adicione um caminho ao arquivo de recurso compilado (.res) à página de propriedades Application do projeto.

  3. Escreva seu provedor. As etapas a seguir mostram as chamadas feitas por um provedor:

    1. Chame o CounterSet.CounterSet construtor para definir o conjunto de contadores. Chame esse método para cada conjunto de contadores definido no manifesto.

    2. Para cada conjunto de contadores, chame um dos CounterSet.AddCounter métodos para adicionar os contadores ao conjunto. Chame esse método para cada contador definido no conjunto de contadores.

    3. Chame o CounterSet.CreateCounterSetInstance método para criar uma instância do conjunto de contadores (uma instância contém os dados do contador). Para conjuntos de contadores de instância única, chame esse método uma vez. Para conjuntos de contadores de várias instâncias, chame esse método para cada instância para a qual você precisa fornecer dados de contador (use um nome exclusivo para cada instância).

    4. Use a CounterSetInstance.Counters propriedade para acessar e definir os dados do contador para o contador.

  4. Depois de concluir o provedor, use a ferramenta LodCtr para registrar os contadores no computador. Por exemplo,

    lodctr /m:provider.man  
    

    O exemplo pressupõe que o manifesto e o arquivo executável estejam no diretório atual.

Você pode usar as classes nesse namespace em computadores que executam o Windows Vista e sistemas operacionais posteriores.