Sdílet prostřednictvím


System.Diagnostics.PerformanceData Obor názvů

K zadání dat čítačů použijte třídy v tomto oboru názvů. Čítače se používají ke zveřejnění metrik výkonu příjemcům, jako je Sledování výkonu. Obor názvů neobsahuje třídy pro využívání dat čítačů. Úplný popis architektury čítačů výkonu najdete v tématu Čítače výkonu.

Třídy

CounterData

Obsahuje nezpracovaná data pro čítač.

CounterSet

Definuje sadu logických čítačů.

CounterSetInstance

Vytvoří instanci logických čítačů definovaných ve CounterSet třídě .

CounterSetInstanceCounterDataSet

Obsahuje kolekci hodnot čítačů.

Výčty

CounterSetInstanceType

Určuje, jestli sada čítačů umožňuje více instancí, jako jsou procesy a fyzické disky, nebo jednu instanci, například paměť.

CounterType

Definuje možné typy čítačů. Každému čítači je přiřazen typ čítače. Typ čítače určuje, jak se data čítače počítají, zprůměrují a zobrazují.

Příklady

Následující příklad ukazuje jednoduchý 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>  

Následující příklad ukazuje jednoduchou implementaci zprostředkovatele 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;  
            }  
        }  

Poznámky

Třídy v tomto oboru názvů podporují novou architekturu (verze 2.0) pro čítače výkonu, která byla zavedena v systému Windows Vista. V nové architektuře už zprostředkovatel nereaguje na požadavky příjemců přímo, ale místo toho jednoduše udržuje data čítače. Systém vloží vlákno do procesu zprostředkovatele, když zprostředkovatel vytvoří instanci sady čítačů; vlákno zodpovídá za zpracování požadavků příjemců.

Následující kroky ukazují proces vytvoření poskytovatele čítačů.

  1. Čítače, které zprostředkovatel poskytuje, jsou definovány v manifestu založeném na jazyce XML. Čítače jsou logicky seskupené do sad čítačů. Čítače v sadě čítačů jsou identifikovány číselným identifikátorem, který je v rámci sady čítačů jedinečný. Zprostředkovatel může definovat jednu nebo více sad čítačů. Sada čítačů je identifikována identifikátorem GUID, který je pro zprostředkovatele jedinečný. Všimněte si, že pokud k zápisu zprostředkovatele použijete tyto třídy:

    • Atribut zpětného volání elementu provider je ignorován.

    • Referenční hodnota atributu name elementu counterAttribute je ignorována.

    Podrobnosti o zápisu manifestu najdete v tématu Schéma čítačů výkonu.

  2. Po napsání manifestu použijte nástroj CTRPP ke kompilaci manifestu (ctrpp provider.man). Nástroj generuje čtyři soubory: .h, .c, .rc a *_r.h. Soubory .h a .c můžete ignorovat. Soubor .rc obsahuje lokalizované řetězce definované v manifestu. Soubory .rc a *_r.h můžete použít k vytvoření zkompilovaného souboru prostředků (.res), který zahrnete do projektu. Následující volání ukazuje, jak zkompilovat soubor prostředků:

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

    Pokud se zobrazí chyba, která odkazuje na sal.h, zkopírujte soubor sal.h z adresáře Microsoft sady Visual Studio, Visual C include do adresáře, který zadáte pro přepínač /i.

    Přidejte cestu ke zkompilovanému souboru prostředků (.res) na stránku vlastností aplikace projektu.

  3. Napište svého poskytovatele. Následující postup ukazuje volání provedená poskytovatelem:

    1. Voláním konstruktoru CounterSet.CounterSet definujte sadu čítačů. Volání této metody pro každou sadu čítačů definovanou v manifestu.

    2. Pro každou sadu čítačů zavolejte jednu z CounterSet.AddCounter metod pro přidání čítačů do sady. Volejte tuto metodu pro každý čítač definovaný v sadě čítačů.

    3. Voláním CounterSet.CreateCounterSetInstance metody vytvořte instanci sady čítačů (instance obsahuje data čítače). V případě sad čítačů s jednou instancí volejte tuto metodu jednou. Pro více sad čítačů instancí volejte tuto metodu pro každou instanci, pro kterou potřebujete zadat data čítače (pro každou instanci použijte jedinečný název).

    4. CounterSetInstance.Counters Pomocí vlastnosti můžete získat přístup k datům čítače a nastavit je pro tento čítač.

  4. Po dokončení zprostředkovatele použijte nástroj LodCtr k registraci čítačů v počítači. Třeba

    lodctr /m:provider.man  
    

    Příklad předpokládá, že manifest a spustitelný soubor jsou v aktuálním adresáři.

Třídy v tomto oboru názvů můžete použít v počítačích se systémem Windows Vista a novějšími operačními systémy.