System.Diagnostics.PerformanceData Przestrzeń nazw

Użyj klas w tej przestrzeni nazw, aby zapewnić dane licznika. Liczniki są używane do uwidaczniania metryk wydajności użytkownikom, takim jak monitor wydajności. Przestrzeń nazw nie zawiera klas do korzystania z danych licznika. Pełny opis architektury liczników wydajności można znaleźć w temacie Liczniki wydajności.

Klasy

CounterData

Zawiera dane pierwotne dla licznika.

CounterSet

Definiuje zestaw liczników logicznych.

CounterSetInstance

Tworzy wystąpienie liczników logicznych zdefiniowanych w CounterSet klasie.

CounterSetInstanceCounterDataSet

Zawiera kolekcję wartości liczników.

Wyliczenia

CounterSetInstanceType

Określa, czy zestaw liczników zezwala na wiele wystąpień, takich jak procesy i dyski fizyczne, czy jedno wystąpienie, takie jak pamięć.

CounterType

Definiuje możliwe typy liczników. Każdy licznik ma przypisany typ licznika. Typ licznika określa sposób obliczania, średniego i wyświetlania danych licznika.

Przykłady

Poniżej przedstawiono prosty 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>  

Poniżej przedstawiono prostą implementację dostawcy dla manifestu:

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

Uwagi

Klasy w tej przestrzeni nazw obsługują nową architekturę (wersja 2.0) dla liczników wydajności, które zostały wprowadzone w Windows Vista. W nowej architekturze dostawca nie odpowiada już bezpośrednio na żądania konsumentów, ale po prostu utrzymuje dane licznika. System wprowadza wątek do procesu dostawcy, gdy dostawca tworzy wystąpienie zestawu liczników; wątek jest odpowiedzialny za obsługę żądań konsumentów.

W poniższych krokach przedstawiono proces pisania dostawcy liczników.

  1. Liczniki, które dostarcza dostawca, są definiowane w manifeście opartym na języku XML. Liczniki są logicznie grupowane w zestawy liczników. Liczniki w zestawie liczników są identyfikowane przez identyfikator liczbowy, który jest unikatowy w zestawie liczników. Dostawca może zdefiniować jeden lub więcej zestawów liczników. Zestaw liczników jest identyfikowany przez identyfikator GUID unikatowy dla dostawcy. Należy pamiętać, że jeśli używasz tych klas do pisania dostawcy:

    • Atrybut wywołania zwrotnego elementu dostawcy jest ignorowany.

    • Wartość odwołania atrybutu name elementu counterAttribute jest ignorowana.

    Aby uzyskać szczegółowe informacje na temat pisania manifestu, zobacz Schemat liczników wydajności.

  2. Po napisaniu manifestu użyj narzędzia CTRPP , aby skompilować manifest (ctrpp provider.man). Narzędzie generuje cztery pliki: .h, .c, .rc i *_r.h. Możesz zignorować pliki .h i .c. Plik RC zawiera zlokalizowane ciągi zdefiniowane w manifeście. Pliki .rc i *_r.h służą do tworzenia skompilowanego pliku zasobów (res) uwzględnionego w projekcie. Następujące wywołanie pokazuje, jak skompilować plik zasobu:

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

    Jeśli wystąpi błąd, który odwołuje się do sal.h, skopiuj plik sal.h z Microsoft Visual Studio, katalog dołączania programu Visual C do katalogu określonego dla przełącznika /i.

    Dodaj ścieżkę do skompilowanego pliku zasobów (res) na stronie właściwości Aplikacji projektu.

  3. Napisz dostawcę. W poniższych krokach pokazano wywołania wykonywane przez dostawcę:

    1. Wywołaj konstruktor, CounterSet.CounterSet aby zdefiniować zestaw liczników. Wywołaj tę metodę dla każdego zestawu liczników zdefiniowanego w manifeście.

    2. Dla każdego zestawu liczników wywołaj jedną z CounterSet.AddCounter metod, aby dodać liczniki do zestawu. Wywołaj tę metodę dla każdego licznika zdefiniowanego w zestawie liczników.

    3. Wywołaj metodę CounterSet.CreateCounterSetInstance , aby utworzyć wystąpienie zestawu liczników (wystąpienie zawiera dane licznika). W przypadku zestawów liczników pojedynczego wystąpienia wywołaj tę metodę jednorazowo. W przypadku wielu zestawów liczników wystąpień wywołaj tę metodę dla każdego wystąpienia, dla którego należy podać dane licznika (użyj unikatowej nazwy dla każdego wystąpienia).

    4. CounterSetInstance.Counters Użyj właściwości , aby uzyskać dostęp do licznika i ustawić dane licznika.

  4. Po zakończeniu korzystania z dostawcy użyj narzędzia LodCtr , aby zarejestrować liczniki na komputerze. Na przykład

    lodctr /m:provider.man  
    

    W przykładzie przyjęto założenie, że plik manifestu i pliku wykonywalnego znajdują się w bieżącym katalogu.

Można użyć klas w tej przestrzeni nazw na komputerach z systemem Windows Vista i nowszych systemów operacyjnych.