System.Diagnostics.PerformanceData Espacio de nombres

Utilice las clases de este espacio de nombres para proporcionar los datos del contador. Los contadores se utilizan para exponer las métricas de rendimiento a los consumidores, como el Monitor de rendimiento. El espacio de nombres no contiene clases para consumir los datos del contador. Para obtener una descripción completa de la arquitectura de los contadores de rendimiento, consulte Contadores de rendimiento.

Clases

CounterData

Contiene los datos sin procesar para un contador.

CounterSet

Define un conjunto de contadores lógicos.

CounterSetInstance

Crea una instancia de los contadores lógicos definidos en la clase CounterSet.

CounterSetInstanceCounterDataSet

Contiene la colección de valores de un contador.

Enumeraciones

CounterSetInstanceType

Especifica si el conjunto de contadores permite varias instancias, como procesos y discos físicos, o una única instancia, como la memoria.

CounterType

Define los tipos posibles de contadores. Cada contador está asignado a un tipo de contador. El tipo de contador determina el modo en que se calculan los datos del contador, se muestran y se calcula su promedio.

Ejemplos

A continuación se muestra un manifiesto simple:

<!-- <?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>  

A continuación se muestra una implementación de proveedor simple para el manifiesto:

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;  
            }  
        }  

Comentarios

Las clases de este espacio de nombres admiten la nueva arquitectura (versión 2.0) para los contadores de rendimiento que se introdujeron en Windows Vista. En la nueva arquitectura, el proveedor ya no responde directamente a las solicitudes de consumidor, sino que simplemente mantiene los datos del contador. El sistema inserta un subproceso en el proceso del proveedor cuando el proveedor crea una instancia del conjunto de contadores; el subproceso es responsable de controlar las solicitudes de consumidor.

En los pasos siguientes se muestra el proceso para escribir un proveedor de contadores.

  1. Los contadores que proporciona el proveedor se definen en un manifiesto basado en XML. Los contadores se agrupan lógicamente en conjuntos de contadores. Los contadores de un conjunto de contadores se identifican mediante un identificador numérico que es único dentro del conjunto de contadores. Un proveedor puede definir uno o varios conjuntos de contadores. Un conjunto de contadores se identifica mediante un GUID que es único para un proveedor. Tenga en cuenta que si usa estas clases para escribir el proveedor:

    • Se omite el atributo de devolución de llamada del elemento provider.

    • Se omite el valor de referencia para el atributo name del elemento counterAttribute.

    Para obtener más información sobre cómo escribir el manifiesto, consulte Esquema de contadores de rendimiento.

  2. Después de escribir el manifiesto, use la herramienta CTRPP para compilar el manifiesto (ctrpp provider.man). La herramienta genera cuatro archivos: .h, .c, .rc y *_r.h. Puede omitir los archivos .h y .c. El archivo .rc contiene las cadenas localizadas definidas en el manifiesto. Use los archivos .rc y *_r.h para crear el archivo de recursos compilado (.res) que incluya en el proyecto. La siguiente llamada muestra cómo compilar el archivo de recursos:

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

    Si recibe un error que hace referencia a sal.h, copie el archivo sal.h de la Microsoft Visual Studio, el directorio include de Visual C en el directorio que especifique para el modificador /i.

    Agregue una ruta de acceso al archivo de recursos compilado (.res) a la página de propiedades Application del proyecto.

  3. Escriba el proveedor. En los pasos siguientes se muestran las llamadas realizadas por un proveedor:

    1. Llame al CounterSet.CounterSet constructor para definir el conjunto de contadores. Llame a este método para cada conjunto de contadores definido en el manifiesto.

    2. Para cada conjunto de contadores, llame a uno de los CounterSet.AddCounter métodos para agregar los contadores al conjunto. Llame a este método para cada contador definido en el conjunto de contadores.

    3. Llame al CounterSet.CreateCounterSetInstance método para crear una instancia del conjunto de contadores (una instancia contiene los datos del contador). Para conjuntos de contadores de instancia única, llame a este método una vez. Para varios conjuntos de contadores de instancias, llame a este método para cada instancia para la que necesite proporcionar datos de contador (use un nombre único para cada instancia).

    4. Utilice la CounterSetInstance.Counters propiedad para acceder a los datos del contador y establecerlos.

  4. Después de finalizar el proveedor, use la herramienta LodCtr para registrar los contadores en el equipo. Por ejemplo,

    lodctr /m:provider.man  
    

    En el ejemplo se supone que el manifiesto y el archivo ejecutable están en el directorio actual.

Puede usar las clases de este espacio de nombres en equipos que ejecutan los sistemas operativos Windows Vista y versiones posteriores.