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.aspx).



カウンターの生データを格納します。Contains the raw data for a counter.


論理カウンターのセットを定義します。Defines a set of logical counters.


CounterSet クラス内で定義されている論理カウンターのインスタンスを作成します。Creates an instance of the logical counters defined in the CounterSet class.


カウンター値のコレクションを保持します。Contains the collection of counter values.



カウンター セットで、プロセスや物理ディスクのような複数インスタンスを許可するか、メモリのような単一インスタンスに制限するかを指定します。Specifies whether the counter set allows multiple instances such as processes and physical disks, or a single instance such as memory.


使用できるカウンター タイプを定義します。 各カウンターには、カウンター タイプが割り当てられます。 カウンター タイプによって、カウンター データの計算方法、その平均値の求め方、および表示方法が決まります。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=" eventman.xsd"   
        <counters xmlns=>  
              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">  
                          <counterAttribute name = "displayAsReal" />  
                    <counter id = "6"  
                      uri = "Microsoft.Windows.System.PerfCounters.Typing.PercentBase"  
                      type = "perf_sample_base"  
                      detailLevel = "standard">  
                          <counterAttribute name = "noDisplay" />  
        <resources culture="en-US">  
                <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."/>  

マニフェストの単純なプロバイダー実装を次に示します。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)  
        // 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++;  
                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();  


この名前空間のクラスは、Windows Vista で導入されたパフォーマンスカウンターの新しいアーキテクチャ (バージョン 2.0) をサポートしています。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. プロバイダーは、1つまたは複数のカウンターセットを定義できます。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 要素の callback 属性は無視されます。The callback attribute of the provider element is ignored.

    • CounterAttribute 要素の 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. マニフェストを記述した後、 ctrppツールを使用してマニフェストをコンパイルします (ctrpp)。After writing your manifest, use the CTRPP tool to compile the manifest (ctrpp このツールでは、.h、.c、.rc、* _r という4つのファイルが生成されます。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. プロジェクトに含めるコンパイル済みのリソースファイル (.res) を作成するには、.rc ファイルと * _r ファイルを使用します。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 を参照するエラーが発生した場合は、Microsoft Visual Studio から、Visual C インクルードディレクトリから/i スイッチに指定したディレクトリに sal ファイルをコピーします。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メソッドの1つを呼び出して、セットにカウンターを追加します。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). 単一インスタンスのカウンターセットの場合は、このメソッドを1回呼び出します。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 /  

    この例では、マニフェストと実行可能ファイルが現在のディレクトリにあることを前提としています。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.