System.Diagnostics.PerformanceData Namespace

Verwenden Sie die Klassen in diesem Namespace, um Zählerdaten bereitzustellen. Die Zähler werden verwendet, um Leistungsmetriken wie den Systemmonitor für Consumer verfügbar zu machen. Der Namespace enthält keine Klassen zum Verarbeiten der Zählerdaten. Eine vollständige Beschreibung der Leistungsindikatorenarchitektur finden Sie unter Leistungsindikatoren.

Klassen

CounterData

Enthält die unformatierten Daten für einen Indikator.

CounterSet

Definiert einen Satz logischer Indikatoren.

CounterSetInstance

Erstellt eine Instanz der in der CounterSet-Klasse definierten logischen Indikatoren.

CounterSetInstanceCounterDataSet

Enthält die Auflistung der Indikatorwerte.

Enumerationen

CounterSetInstanceType

Gibt an, ob der Indikatorensatz mehrere Instanzen, z. B. Prozesse und physische Datenträger, oder nur eine Instanz, z. B. Speicher, zulässt.

CounterType

Definiert die möglichen Typen von Indikatoren. Jedem Indikator wird ein Indikatortyp zugewiesen. Der Indikatortyp bestimmt, wie die Indikatordaten berechnet werden, wie ihr Durchschnittswert ermittelt wird und wie sie angezeigt werden.

Beispiele

Die folgende Abbildung zeigt ein einfaches Manifest:

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

Im Folgenden wird eine einfache Anbieterimplementierung für das Manifest veranschaulicht:

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

Hinweise

Die Klassen in diesem Namespace unterstützen die neue Architektur (Version 2.0) für Leistungsindikatoren, die in Windows Vista eingeführt wurde. In der neuen Architektur reagiert der Anbieter nicht mehr direkt auf Consumeranforderungen, sondern verwaltet einfach die Zählerdaten. Das System fügt einen Thread in den Prozess des Anbieters ein, wenn der Anbieter eine Instanz des Indikatorsatzes erstellt. Der Thread ist für die Verarbeitung von Consumeranforderungen verantwortlich.

Die folgenden Schritte zeigen den Prozess zum Schreiben eines Leistungsindikatorenanbieters.

  1. Die vom Anbieter bereitgestellten Leistungsindikatoren werden in einem XML-basierten Manifest definiert. Die Indikatoren werden logisch in Indikatorensätze gruppiert. Die Leistungsindikatoren innerhalb eines Zählersatzes werden durch einen numerischen Bezeichner identifiziert, der innerhalb des Zählersatzes eindeutig ist. Ein Anbieter kann einen oder mehrere Zählersätze definieren. Ein Zählersatz wird durch eine Guid identifiziert, die für einen Anbieter eindeutig ist. Beachten Sie folgendes, wenn Sie diese Klassen zum Schreiben Ihres Anbieters verwenden:

    • Das Rückrufattribut des Anbieterelements wird ignoriert.

    • Der Verweiswert für das name-Attribut des counterAttribute-Elements wird ignoriert.

    Ausführliche Informationen zum Schreiben des Manifests finden Sie unter Leistungsindikatorenschema.

  2. Nachdem Sie Ihr Manifest geschrieben haben, verwenden Sie das CTRPP-Tool , um das Manifest (ctrpp provider.man) zu kompilieren. Das Tool generiert vier Dateien: .h, .c, .rc und *_r.h. Sie können die H- und C-Dateien ignorieren. Die RC-Datei enthält die lokalisierten Zeichenfolgen, die in Ihrem Manifest definiert sind. Sie verwenden die Rc- und *_r.h-Dateien, um die kompilierte Ressourcendatei (RES) zu erstellen, die Sie in Ihr Projekt einschließen. Der folgende Aufruf zeigt, wie die Ressourcendatei kompiliert wird:

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

    Wenn Sie einen Fehler erhalten, der auf sal.h verweist, kopieren Sie die Datei sal.h aus Ihrem Microsoft Visual Studio, Visual C include-Verzeichnis in das Verzeichnis, das Sie für den /i-Schalter angeben.

    Fügen Sie der Anwendungseigenschaftenseite Ihres Projekts einen Pfad zur kompilierten Ressourcendatei (RES) hinzu.

  3. Schreiben Sie Ihren Anbieter. Die folgenden Schritte zeigen die Aufrufe eines Anbieters:

    1. Rufen Sie den CounterSet.CounterSet Konstruktor auf, um den Leistungsindikatorsatz zu definieren. Rufen Sie diese Methode für jeden im Manifest definierten Zählersatz auf.

    2. Rufen Sie für jeden Leistungsindikatorsatz eine der CounterSet.AddCounter Methoden auf, um die Indikatoren dem Satz hinzuzufügen. Rufen Sie diese Methode für jeden im Leistungsindikatorsatz definierten Leistungsindikator auf.

    3. Rufen Sie die CounterSet.CreateCounterSetInstance -Methode auf, um eine Instanz des Leistungsindikatorsatzes zu erstellen (eine Instanz enthält die Zählerdaten). Rufen Sie diese Methode für Einzelne Instanzzählersätze einmal auf. Rufen Sie für mehrere Instanzzählersätze diese Methode für jede Instanz auf, für die Sie Zählerdaten bereitstellen müssen (verwenden Sie einen eindeutigen Namen für jede Instanz).

    4. Verwenden Sie die CounterSetInstance.Counters -Eigenschaft, um auf die Zählerdaten für den Zähler zuzugreifen und diese festzulegen.

  4. Nachdem Sie Ihren Anbieter abgeschlossen haben, verwenden Sie das LodCtr-Tool , um die Indikatoren auf dem Computer zu registrieren. Beispiel:

    lodctr /m:provider.man  
    

    Im Beispiel wird davon ausgegangen, dass sich das Manifest und die ausführbare Datei im aktuellen Verzeichnis befinden.

Sie können die Klassen in diesem Namespace auf Computern verwenden, auf denen windows Vista und höhere Betriebssysteme ausgeführt werden.