System.Diagnostics.PerformanceData Espaço de Nomes

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

Classes

Name Description
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 CounterSet classe.

CounterSetInstanceCounterDataSet

Contém a coleção de valores contadores.

Enumerações

Name Description
CounterSetInstanceType

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

CounterType

Define os tipos possíveis de contadores. Cada marcador recebe um tipo de contador. O tipo de contador determina como os dados do contador são calculados, mediados e apresentados.

Exemplos

Segue-se 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>

Segue-se uma implementação simples do fornecedor 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;
            }
        }

Observações

As classes neste namespace suportam a nova arquitetura (versão 2.0) para contadores de desempenho que foi introduzida no Windows Vista. Na nova arquitetura, o fornecedor já não responde diretamente aos pedidos dos consumidores, mas limita-se a manter os dados do contador. O sistema injeta um thread no processo do fornecedor quando este cria uma instância do conjunto de contadores; O tópico é responsável por tratar dos pedidos dos consumidores.

Os passos seguintes mostram o processo para escrever um fornecedor de contadores.

  1. Os contadores que o fornecedor fornece são definidos num manifesto baseado em XML. Os contadores estão logicamente agrupados em conjuntos de contadores. Os contadores dentro de um conjunto de contadores são identificados por um identificador numérico que é único dentro do conjunto de contadores. Um fornecedor pode definir um ou mais conjuntos contadores. Um conjunto de contadores é identificado por um Guid que é único para um fornecedor. Note que, se usar estas aulas para escrever o seu prestador:

    • O atributo de callback do elemento provider é ignorado.

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

    Para detalhes sobre como escrever o manifesto, consulte Performance Counters Schema.

  2. Depois de escrever o teu manifesto, usa a ferramenta CTRPP para compilar o manifesto (ctrpp provider.man). A ferramenta gera quatro ficheiros: .h, .c, .rc e *_r.h. Podes ignorar os ficheiros .h e .c. O ficheiro .rc contém as strings localizadas definidas no seu manifesto. Usas os ficheiros .rc e *_r.h para criar o ficheiro de recurso compilado (.res) que inclues no teu projeto. A seguinte chamada mostra como compilar o ficheiro de recurso:

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

    Se aparecer um erro que faça referência ao sal.h, copie o ficheiro sal.h do seu diretório Microsoft Visual Studio, incluindo Visual C para o diretório que especifica para o switch /i.

    Adicione um caminho ao ficheiro de recurso compilado (.res) na página de propriedades da aplicação do seu projeto.

  3. Escreva ao seu prestador. Os passos seguintes mostram as chamadas feitas por um fornecedor:

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

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

    3. Chame o CounterSet.CreateCounterSetInstance método para criar uma instância do conjunto contador (uma instância contém os dados do contador). Para conjuntos de contadores de instância única, chame este método uma vez. Para múltiplos conjuntos de contadores de instância, chame este método para cada instância para a qual precisa fornecer dados de contador (use um nome único para cada instância).

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

  4. Depois de terminares o teu fornecedor, usa a ferramenta LodCtr para registar os contadores no computador. Por exemplo

    lodctr /m:provider.man
    

    O exemplo assume que o ficheiro manifest e executável estão no diretório atual.

Pode usar as classes deste namespace em computadores que correm o Windows Vista e sistemas operativos posteriores.