System.Diagnostics.PerformanceData Пространство имен

Классы в этом пространстве имен используются для предоставления данных счетчиков. Счетчики позволяют отображать для пользователей такие метрики производительности, как системный монитор. Пространство имен содержит классы для использования данных счетчиков. См. описание архитектуры счетчиков производительности.

Классы

CounterData

Содержит необработанные данные для счетчика.

CounterSet

Идентифицирует набор логических счетчиков.

CounterSetInstance

Создает экземпляр логических счетчиков, определенных в классе CounterSet.

CounterSetInstanceCounterDataSet

Содержит набор значений счетчика.

Перечисления

CounterSetInstanceType

Указывает, допустимо ли для набора счетчиков использование нескольких экземпляров, например, процессов или физических дисков, или одного экземпляра, например, памяти.

CounterType

Определяет возможные типы счетчика. Каждому счетчику присваивается тип. Тип счетчика определяет способ вычисления, усреднения и отображения данных счетчиков.

Примеры

Ниже показан простой манифест:

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

Ниже показана простая реализация поставщика для манифеста:

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

Комментарии

Классы в этом пространстве имен поддерживают новую архитектуру (версия 2.0) для счетчиков производительности, появившиеся в Windows Vista. В новой архитектуре поставщик больше не отвечает на запросы потребителей напрямую, а просто сохраняет данные счетчика. Система внедряет поток в процесс поставщика, когда поставщик создает экземпляр набора счетчиков; поток отвечает за обработку запросов потребителей.

Ниже показан процесс записи поставщика счетчиков.

  1. Счетчики, которые предоставляет поставщик, определяются в xml-манифесте. Счетчики логически группируются в наборы счетчиков. Счетчики в наборе счетчиков идентифицируются по числовым идентификаторам, уникальным в пределах набора счетчиков. Поставщик может определить один или несколько наборов счетчиков. Набор счетчиков идентифицируется уникальным для поставщика guid. Обратите внимание, что при использовании этих классов для записи поставщика:

    • Атрибут обратного вызова элемента provider игнорируется.

    • Значение ссылки для атрибута name элемента counterAttribute игнорируется.

    Дополнительные сведения о написании манифеста см. в разделе Схема счетчиков производительности.

  2. После написания манифеста используйте средство CTRPP для компиляции манифеста (ctrpp provider.man). Средство создает четыре файла: .h, .c, .rc и *_r.h. H- и C-файлы можно игнорировать. RC-файл содержит локализованные строки, определенные в манифесте. Файлы RC и *_r.h используются для создания скомпилированного файла ресурсов (RES), который вы включаете в проект. В следующем вызове показано, как скомпилировать файл ресурсов:

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

    Если возникает ошибка, ссылающаяся на sal.h, скопируйте файл sal.h из Майкрософт каталоге Visual Studio, Visual C include в каталог, указанный для параметра /i.

    Добавьте путь к скомпилированному файлу ресурсов (RES) на страницу свойств приложения проекта.

  3. Напишите поставщика. Ниже показаны вызовы, выполненные поставщиком.

    1. CounterSet.CounterSet Вызовите конструктор для определения набора счетчиков. Вызовите этот метод для каждого набора счетчиков, определенного в манифесте.

    2. Для каждого набора счетчиков вызовите один из CounterSet.AddCounter методов , чтобы добавить счетчики в набор. Вызовите этот метод для каждого счетчика, определенного в наборе счетчиков.

    3. CounterSet.CreateCounterSetInstance Вызовите метод , чтобы создать экземпляр набора счетчиков (экземпляр содержит данные счетчика). Для наборов счетчиков с одним экземпляром вызовите этот метод один раз. Для нескольких наборов счетчиков экземпляров вызовите этот метод для каждого экземпляра, для которого необходимо предоставить данные счетчика (используйте уникальное имя для каждого экземпляра).

    4. Используйте свойство , CounterSetInstance.Counters чтобы получить доступ к данным счетчика и задать их.

  4. После завершения работы поставщика используйте средство LodCtr для регистрации счетчиков на компьютере. Например, примененная к объекту директива

    lodctr /m:provider.man  
    

    В примере предполагается, что манифест и исполняемый файл находятся в текущем каталоге.

Классы в этом пространстве имен можно использовать на компьютерах под управлением Windows Vista и более поздних версий операционных систем.