Esta documentación está archivada y no tiene mantenimiento.

System.Diagnostics.PerformanceData (Espacio de nombres)

Actualización: noviembre 2007

Utilice las clases de este espacio de nombres para proporcionar los datos del contador. Los contadores se utilizan para mostrar las métricas de rendimiento a los consumidores, como el Monitor de rendimiento. El espacio de nombres no contiene clases destinadas a utilizar los datos del contador. Para obtener una descripción completa sobre la arquitectura de los contadores de rendimiento, vea Performance Counters.

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

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

  1. Los contadores que el proveedor proporciona se definen en un manifiesto basado en XML. Los contadores se agrupan de forma lógica en conjuntos de contadores. Los contadores de un conjunto de contadores se identifican mediante un identificador numérico que es único en ese conjunto. Un proveedor puede definir uno o varios conjuntos de contadores. Un conjunto de contadores se identifica mediante un Guid que es exclusivo de un determinado proveedor. Tenga en cuenta que si utiliza estas clases para escribir su proveedor:

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

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

    Para obtener información detalla acerca de cómo se escribe el manifiesto, vea Performance Counters Schema.

  2. Después de escribir su manifiesto, utilice 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 adaptadas definidas en el manifiesto. Utilice los archivos .rc y *_r.h para crear el archivo de recursos compilado (.res) que va a incluir en su proyecto. En la llamada siguiente se muestra cómo se compila el archivo de recursos:

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

    Si obtiene un error que hace referencia a sal.h, copie el archivo sal.h del directorio de inclusión de Visual C de Microsoft Visual Studio en el directorio especificado para el modificador /i.

    Agregue una ruta de acceso al archivo de recursos compilado (.res) en la página de propiedades de la aplicación del proyecto.

  3. Escriba su proveedor. En los pasos siguientes se muestran las llamadas realizadas mediante un proveedor:

    1. Llame al constructor CounterSet.CounterSet 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 métodos CounterSet.AddCounter si desea agregar contadores al conjunto. Llame a este método para cada contador definido en el conjunto de contadores.

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

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

  4. Una vez que finalice el proveedor, utilice 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. Para obtener información detallada acerca de cómo se utiliza LodCtr, vea Microsoft .

Las clases de este espacio de nombres sólo funcionan en Windows Vista.

  ClaseDescripción
Bb298763.pubclass(es-es,VS.90).gifCounterDataContiene los datos sin formato para un contador.
Bb298763.pubclass(es-es,VS.90).gifCounterSetDefine un conjunto de contadores lógicos.
Bb298763.pubclass(es-es,VS.90).gifCounterSetInstanceCrea una instancia de los contadores lógicos definidos en la clase CounterSet.
Bb298763.pubclass(es-es,VS.90).gifCounterSetInstanceCounterDataSetContiene la colección de valores de un contador.

  EnumeraciónDescripción
Bb298763.pubenumeration(es-es,VS.90).gifCounterSetInstanceTypeEspecifica si el conjunto de contadores permite varias instancias, como procesos y discos físicos, o una única instancia, como la memoria.
Bb298763.pubenumeration(es-es,VS.90).gifCounterTypeDefine 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.

A continuación se muestra un manifiesto sencillo:

<!-- <?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 sencilla del proveedor del 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 Containg 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 :
                    typingCsInstance.Counters["A Key Pressed"].Value++;
                    numberOfLetterAInWord++;

                    break;

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

                    if (numberOfLetterAInWord > 0)
                    {
                        typingCsInstance.Counters["Words Containing A"].Value++;
                        typingCsInstance.Counters["Percent of Words Containg A"].Value++;
                        numberOfLetterAInWord = 0;
                    }

                    typingCsInstance.Counters["Percent Base"].Value++;
                    typingCsInstance.Counters["Total Word Count"].Value++;
                    typingCsInstance.Counters["Words Typed In Interval"].Value++;

                    break;
            }
        }
Mostrar: