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

Классы в этом пространстве имен используются для предоставления данных счетчиков. Use the classes in this namespace to provide counter data. Счетчики позволяют отображать для пользователей такие метрики производительности, как системный монитор. The counters are used to expose performance metrics to consumers such as the Performance Monitor. Пространство имен содержит классы для использования данных счетчиков. The namespace does not contain classes for consuming the counter data. См. описание архитектуры счетчиков производительности. For a complete description of the performance counters architecture, see Performance Counters.

Классы

CounterData

Содержит необработанные данные для счетчика.Contains the raw data for a counter.

CounterSet

Идентифицирует набор логических счетчиков.Defines a set of logical counters.

CounterSetInstance

Создает экземпляр логических счетчиков, определенных в классе CounterSet.Creates an instance of the logical counters defined in the CounterSet class.

CounterSetInstanceCounterDataSet

Содержит набор значений счетчика.Contains the collection of counter values.

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

CounterSetInstanceType

Указывает, допустимо ли для набора счетчиков использование нескольких экземпляров, например, процессов или физических дисков, или одного экземпляра, например, памяти.Specifies whether the counter set allows multiple instances such as processes and physical disks, or a single instance such as memory.

CounterType

Определяет возможные типы счетчика. Каждому счетчику присваивается тип. Тип счетчика определяет способ вычисления, усреднения и отображения данных счетчиков.The counter type determines how the counter data is calculated, averaged, and displayed.

Примеры

Ниже показан простой манифест.The following shows a simple 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>  

Ниже показана простая реализация поставщика для манифеста:The following shows a simple provider implementation for the manifest:

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.The classes in this namespace support the new architecture (version 2.0) for performance counters that was introduced in Windows Vista. В новой архитектуре поставщик больше не реагирует на запросы клиентов напрямую, а вместо этого просто поддерживает данные счетчиков.In the new architecture, the provider no longer responds to consumer requests directly, but instead simply maintains the counter data. Система внедряет поток в процесс поставщика, когда поставщик создает экземпляр набора счетчиков. поток отвечает за обработку запросов клиентов.The system injects a thread into the provider's process when the provider creates an instance of the counter set; the thread is responsible for handling consumer requests.

В следующих шагах показан процесс записи поставщика счетчиков.The following steps show the process for writing a counters provider.

  1. Счетчики, предоставляемые поставщиком, определяются в манифесте на основе XML.The counters that the provider provides is defined in an XML-based manifest. Счетчики логически группируются в наборы счетчиков.The counters are logically grouped into counter sets. Счетчики в наборе счетчиков идентифицируются по числовому идентификатору, уникальному в пределах набора счетчиков.The counters within a counter set are identified by a numeric identifier that is unique within the counter set. Поставщик может определить один или несколько наборов счетчиков.A provider can define one or more counter sets. Набор счетчиков определяется идентификатором GUID, уникальным для поставщика.A counter set is identified by a Guid that is unique to a provider. Обратите внимание, что при использовании этих классов для записи поставщика:Note that if you use these classes to write your provider:

    • Атрибут обратного вызова элемента provider не учитывается.The callback attribute of the provider element is ignored.

    • Значение ссылки для атрибута Name элемента Каунтераттрибуте игнорируется.The reference value for the name attribute of the counterAttribute element is ignored.

    Дополнительные сведения о создании манифеста см. в разделе схема счетчиков производительности.For details on writing the manifest, see Performance Counters Schema.

  2. После записи манифеста используйте средство КТРПП для компиляции манифеста (КТРПП provider. Man).After writing your manifest, use the CTRPP tool to compile the manifest (ctrpp provider.man). Средство создает четыре файла:. h,. c,. RC и * _r. h.The tool generates four files: .h, .c, .rc, and *_r.h. Можно пропускать файлы. h и. c.You can ignore the .h and .c files. RC-файл содержит локализованные строки, определенные в манифесте.The .rc file contains the localized strings defined in your manifest. Используйте файлы. RC и * _r. h для создания скомпилированного файла ресурсов (. res), включаемого в проект.You use the .rc and *_r.h files to create the compiled resource file (.res) that you include in your project. В следующем вызове показано, как скомпилировать файл ресурсов:The following call shows how to compile the resource file:

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

    Если появится сообщение об ошибке, ссылающееся на SAL. h, скопируйте файл SAL. h из каталога Microsoft Visual Studio, Visual C include в каталог, указанный для параметра/i.If you get an error that references sal.h, copy the sal.h file from your Microsoft Visual Studio, Visual C include directory to the directory you specify for the /i switch.

    Добавьте путь к скомпилированному файлу ресурсов (. res) на страницу свойств приложения проекта.Add a path to the compiled resource file (.res) to your project's Application property page.

  3. Напишите поставщик.Write your provider. Следующие шаги показывают вызовы, произведенные поставщиком:The following steps show the calls made by a provider:

    1. Вызовите CounterSet.CounterSet конструктор, чтобы определить набор счетчиков.Call the CounterSet.CounterSet constructor to define the counter set. Вызывайте этот метод для каждого набора счетчиков, определенного в манифесте.Call this method for each counter set defined in the manifest.

    2. Для каждого набора счетчиков вызовите один из CounterSet.AddCounter методов, чтобы добавить счетчики в набор.For each counter set, call one of the CounterSet.AddCounter methods to add the counters to the set. Вызывайте этот метод для каждого счетчика, определенного в наборе счетчиков.Call this method for each counter defined in the counter set.

    3. Вызовите CounterSet.CreateCounterSetInstance метод, чтобы создать экземпляр набора счетчиков (экземпляр содержит данные счетчика).Call the CounterSet.CreateCounterSetInstance method to create an instance of the counter set (an instance contains the counter data). Для наборов счетчиков с одним экземпляром вызовите этот метод один раз.For single instance counter sets, call this method one time. Для наборов счетчиков с несколькими экземплярами Вызывайте этот метод для каждого экземпляра, для которого необходимо предоставить данные счетчика (используйте уникальное имя для каждого экземпляра).For multiple instance counter sets, call this method for each instance for which you need to provide counter data (use a unique name for each instance).

    4. Используйте CounterSetInstance.Counters свойство для доступа и задания данных счетчика для счетчика.Use the CounterSetInstance.Counters property to access and set the counter data for the counter.

  4. После завершения работы поставщика используйте средство lodctr для регистрации счетчиков на компьютере.After you finish your provider, use the LodCtr tool to register the counters on the computer. Например, примененная к объекту директиваFor example,

    lodctr /m:provider.man  
    

    В примере предполагается, что манифест и исполняемый файл находятся в текущем каталоге.The example assumes the manifest and executable file are in the current directory.

Классы в этом пространстве имен можно использовать на компьютерах под управлением Windows Vista и более поздних операционных систем.You can use the classes in this namespace on computers that run the Windows Vista and later operating systems.