Esporta (0) Stampa
Espandi tutto

Spazio dei nomi System.Diagnostics.PerformanceData

Aggiornamento: novembre 2007

Utilizzare le classi di questo spazio dei nomi per fornire i dati dei contatori. I contatori sono utilizzati per esporre le misure delle prestazioni agli utenti, come ad esempio Performance Monitor. Lo spazio dei nomi non contiene classi per l'utilizzo dei dati dei contatori. Per una descrizione completa dell'architettura dei contatori delle prestazioni, vedere Contatori prestazione.

Le classi in questo spazio dei nomi supportano la nuova architettura (versione 2.0) per contatori delle prestazioni introdotta in Windows Vista. Nella nuova architettura, il provider non risponde più direttamente alle richieste dell’utente, ma gestisce semplicemente i dati dei contatori. Il sistema inserisce un thread nel processo del provider quando viene creata un'istanza dell'insieme di contatori; il thread è responsabile per la gestione delle richieste utente.

Nei passaggi seguenti viene illustrato il processo di scrittura di un provider dei contatori.

  1. I contatori che il provider fornisce sono definiti in un manifesto basato su XML. I contatori si sono raggruppati logicamente in insiemi di contatori. I contatori all'interno di un insieme vengono identificati da un identificatore numerico che è univoco all'interno dell'insieme stesso. Un provider può definire uno o più insiemi di contatori. Un insieme di contatori è identificato da un GUID che è univoco per un provider. Si tenga presente che se si utilizzano queste classi per scrivere il provider:

    • L'attributo di callback dell'elemento del provider viene ignorato.

    • Il valore di riferimento per l'attributo name dell'elemento counterAttribute viene ignorato.

    Per ulteriori dettagli sulla scrittura del manifesto, vedere Schema contatori prestazioni.

  2. Dopo avere scritto il manifesto, utilizzare lo strumento CTRPP per compilarlo (ctrpp provider.man). Lo strumento genera quattro file: ..h, .c, ..rc e * _r.h. I file .h e .c possono essere ignorati. Il file .rc contiene le stringhe localizzate definite nel manifesto. Si utilizzano i file..rc e * _r.h per creare il file di risorse compilato (.res) che viene incluso nel progetto. Nella chiamata seguente viene illustrato come compilare il file di risorse:

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

    Se si verifica un errore che fa riferimento al file sal.h, copiare questo file da Microsoft Visual Studio, directory di inclusione Visual C, alla directory specificata per l'opzione /i.

    Aggiungere un percorso al file di risorse compilato (.res) alla pagina delle proprietà dell’applicazione del progetto.

  3. Scrivere il provider. Nei passaggi seguenti vengono illustrate le chiamate fatte da un provider:

    1. Chiamare il costruttore CounterSet.CounterSet per definire l'insieme di contatori. Chiamare questo metodo per ogni insieme di contatori definito nel manifesto.

    2. Per ogni insieme di contatori, chiamare uno dei metodi CounterSet.AddCounter per aggiungere i contatori all'insieme. Chiamare questo metodo per ogni contatore definito nell’insieme di contatori.

    3. Per creare un’istanza dell’insieme di contatori (un’istanza contiene i dati dei contatori) chiamare il metodo CounterSet.CreateCounterSetInstance. Per insiemi di contatori a istanza singola, chiamare questo metodo una volta. Per insiemi di contatori a istanza multipla, chiamare questo metodo per ogni istanza per la quale è necessario fornire i dati dei contatori (utilizzare un nome univoco per ogni istanza).

    4. Utilizzare la proprietà CounterSetInstance.Counters per accedere e impostare i dati dei contatori.

  4. Dopo avere completato il provider, utilizzare lo strumento LodCtr per registrare i contatori sul computer. Ad esempio,

    lodctr /m:provider.man
    

    Nell'esempio si suppone che il manifesto e il file eseguibile siano nella directory corrente. Per informazioni dettagliate sull'utilizzo di LodCtr, vedere Microsoft

Le classi in questo spazio dei nomi funzionano solo con sistema operativo Windows Vista.

  ClasseDescrizione
CounterDataContiene i dati non elaborati per un contatore.
CounterSetDefinisce un insieme di contatori logici.
CounterSetInstanceCrea un'istanza dei contatori logici definita nella classe CounterSet.
CounterSetInstanceCounterDataSetContiene l'insieme di valori del contatore.

  EnumerazioneDescrizione
CounterSetInstanceTypeSpecifica se l'insieme di contatori ammette istanze multiple, ad esempio processi e dischi fisici, o una singola istanza, ad esempio memoria.
CounterTypeDefinisce i possibili tipi di contatori. A ogni contatore viene assegnato un tipo di contatore. Il tipo di contatore determina come i dati dei contatori vengono calcolati, come se ne calcola la media e come vengono visualizzati.

Di seguito viene illustrato un semplice manifesto:

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

Di seguito viene illustrata una semplice implementazione del provider per il 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 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;
            }
        }

Aggiunte alla community

AGGIUNGI
Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
Mostra:
© 2014 Microsoft