DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

パフォーマンスカウンタに値を書き込む

ここでは、独自のパフォーマンスカウンタを作成し、値を書き込む方法を説明します。ここで紹介する方法は、Windows 2000以降のNT系OSでのみ使用でき、またリモートコンピュータでのパフォーマンスカウンタの作成はできません。

カウンタを作成するには、カテゴリも一緒に作成しなければなりません。これは、PerformanceCounterCategory.Createメソッドにより可能です。

新しく作成したパフォーマンスカウンタに値を書き込むには、PerformanceCounterクラスの、IncrementメソッドDecrementメソッドIncrementByメソッドRawValueプロパティのいずれかを使用します。IncrementメソッドとDecrementメソッドはそれぞれカウンタの生の値を1つだけ増減させます。IncrementByメソッドは指定した値だけ生の値を増加させることができます(ただし、Incrementメソッド、Decrementメソッドの方が高速です)。生の値に任意の整数を設定するには、RawValueプロパティを使います。

なおWindows Vista以降でUACが有効になっている時は、管理者に昇格しないと失敗するかもしれません。この対処法については、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。

以下に、カウンタ名"TestCounter"(カウンタタイプNumberOfItems32)のカウンタが含まれる、カテゴリ名"TestCategory"のパフォーマンスカウンタカテゴリを作成する例を示します。なおここでは作成したカテゴリを最後にPerformanceCounterCategory.Deleteメソッドにより削除しています。

VB.NET
コードを隠すコードを選択
'カテゴリ名
Dim categoryName As String = "Test Category"
'カウンタ名
Dim counterName As String = "TestCounter"

'カテゴリが登録されていない時は登録する
If Not System.Diagnostics.PerformanceCounterCategory.Exists(categoryName) Then
    'カテゴリを登録する
    System.Diagnostics.PerformanceCounterCategory.Create( _
        categoryName, _
        "カテゴリの説明を書きます。", _
        counterName, _
        "カウンタの説明を書きます。")
    '.NET Framework 2.0以降では次のようにPerformanceCounterCategoryを指定する
    'System.Diagnostics.PerformanceCounterCategory.Create( _
    '    categoryName, _
    '    "カテゴリの説明を書きます。", _
    '    System.Diagnostics.PerformanceCounterCategoryType.SingleInstance, _
    '    counterName, _
    '    "カウンタの説明を書きます。")
End If

'カウンタが登録されているか調べる
If Not System.Diagnostics.PerformanceCounterCategory.CounterExists( _
    counterName, categoryName) Then
    Console.WriteLine("カウンタが登録されていません。")
    Return
End If

'PerformanceCounterオブジェクトを作成
'ReadOnlyをFalseにする
Dim pc As New System.Diagnostics.PerformanceCounter( _
    categoryName, counterName, False)

Dim i As Integer
For i = 0 To 49
    'カウンタの値を変更する
    pc.RawValue = i
    '1秒待機する
    System.Threading.Thread.Sleep(1000)
Next i

'カテゴリを削除する
System.Diagnostics.PerformanceCounterCategory.Delete(categoryName)
C#
コードを隠すコードを選択
//カテゴリ名
string categoryName = "Test Category";
//カウンタ名
string counterName = "TestCounter";

//カテゴリが登録されていない時は登録する
if (!System.Diagnostics.PerformanceCounterCategory.Exists(categoryName))
{
    //カテゴリを登録する
    System.Diagnostics.PerformanceCounterCategory.Create(
        categoryName,
        "カテゴリの説明を書きます。",
        counterName,
        "カウンタの説明を書きます。");
    //.NET Framework 2.0以降では次のようにPerformanceCounterCategoryを指定する
    //System.Diagnostics.PerformanceCounterCategory.Create(
    //    categoryName,
    //    "カテゴリの説明を書きます。",
    //    System.Diagnostics.PerformanceCounterCategoryType.SingleInstance,
    //    counterName,
    //    "カウンタの説明を書きます。");
}

//カウンタが登録されているか調べる
if (!System.Diagnostics.PerformanceCounterCategory.CounterExists(
    counterName, categoryName))
{
    Console.WriteLine("カウンタが登録されていません。");
    return;
}

//PerformanceCounterオブジェクトを作成
//ReadOnlyをFalseにする
System.Diagnostics.PerformanceCounter pc =
    new System.Diagnostics.PerformanceCounter(
        categoryName, counterName, false);

for (int i = 0; i < 50; i++)
{
    //カウンタの値を変更する
    pc.RawValue = i;
    //1秒待機する
    System.Threading.Thread.Sleep(1000);
}

//カテゴリを削除する
System.Diagnostics.PerformanceCounterCategory.Delete(categoryName);

複数のカウンタを含むカテゴリを作成する

上記の例では、一つのカウンタのみを含むカテゴリを作成しました。次の例では、複数のカウンタ(といっても2つですが)を含むカテゴリを作成しています。

VB.NET
コードを隠すコードを選択
'CounterCreationDataCollectionオブジェクトの作成
Dim ccdc As New System.Diagnostics.CounterCreationDataCollection()

'CounterCreationDataオブジェクトの作成
Dim ccd1 As New System.Diagnostics.CounterCreationData()
ccd1.CounterName = "TestCounter1"
ccd1.CounterHelp = "ここにTestCounter1の説明を書きます。"
ccd1.CounterType = System.Diagnostics.PerformanceCounterType.NumberOfItems32
'CounterCreationDataCollectionに追加
ccdc.Add(ccd1)

'もう一つ作成して追加
Dim ccd2 As New System.Diagnostics.CounterCreationData()
ccd2.CounterName = "TestCounter2"
ccd2.CounterHelp = "ここにTestCounter2の説明を書きます。"
ccd2.CounterType = _
    System.Diagnostics.PerformanceCounterType.RateOfCountsPerSecond32
ccdc.Add(ccd2)

'カテゴリを登録する
System.Diagnostics.PerformanceCounterCategory.Create( _
    "Test Category", _
    "ここにTest Categoryの説明を書く。", _
    ccdc)
'.NET Framework 2.0以降では次のようにPerformanceCounterCategoryTypeを指定する
'System.Diagnostics.PerformanceCounterCategory.Create( _
'    "Test Category", _
'    "ここにTest Categoryの説明を書く。", _
'    System.Diagnostics.PerformanceCounterCategoryType.MultiInstance, _
'    ccdc)
C#
コードを隠すコードを選択
//CounterCreationDataCollectionオブジェクトの作成
System.Diagnostics.CounterCreationDataCollection ccdc =
    new System.Diagnostics.CounterCreationDataCollection();

//CounterCreationDataオブジェクトの作成
System.Diagnostics.CounterCreationData ccd1 =
    new System.Diagnostics.CounterCreationData();
ccd1.CounterName = "TestCounter1";
ccd1.CounterHelp = "ここにTestCounter1の説明を書きます。";
ccd1.CounterType =
    System.Diagnostics.PerformanceCounterType.NumberOfItems32;
//CounterCreationDataCollectionに追加
ccdc.Add(ccd1);

//もう一つ作成して追加
System.Diagnostics.CounterCreationData ccd2 =
    new System.Diagnostics.CounterCreationData();
ccd2.CounterName = "TestCounter2";
ccd2.CounterHelp = "ここにTestCounter2の説明を書きます。";
ccd2.CounterType =
    System.Diagnostics.PerformanceCounterType.RateOfCountsPerSecond32;
ccdc.Add(ccd2);

//カテゴリを登録する
System.Diagnostics.PerformanceCounterCategory.Create(
    "Test Category",
    "ここにTest Categoryの説明を書く。",
    ccdc);
//.NET Framework 2.0以降では次のようにPerformanceCounterCategoryTypeを指定する
//System.Diagnostics.PerformanceCounterCategory.Create(
//    "Test Category",
//    "ここにTest Categoryの説明を書く。",
//    System.Diagnostics.PerformanceCounterCategoryType.MultiInstance,
//    ccdc);

カウンタにインスタンスを追加する

カウンタにインスタンスを追加するには、PerformanceCounterオブジェクトのInstanceNameプロパティに追加するインスタンス名を設定し、RawValueプロパティに適当な値を設定します。カウンタのInstanceNameプロパティに設定されたインスタンスが無い時、値が設定されると、インスタンスが作成されます。

インスタンスを削除するには、PerformanceCounter.RemoveInstanceメソッドを使います。

インスタンスの追加と削除は動的に行うことができます。

VB.NET
コードを隠すコードを選択
'PerformanceCounterオブジェクトを作成
'インスタンス名を"0"とする
Dim pc As New System.Diagnostics.PerformanceCounter( _
    "Test Category", "TestCounter", "0", False)
'生の値を設定する
pc.RawValue = 0

'新しいインスタンス"1"を追加する
pc.InstanceName = "1"
pc.RawValue = 100

'インスタンスを削除する
pc.RemoveInstance()
C#
コードを隠すコードを選択
//PerformanceCounterオブジェクトを作成
//インスタンス名を"0"とする
System.Diagnostics.PerformanceCounter pc =
    new System.Diagnostics.PerformanceCounter(
        "Test Category", "TestCounter", "0", false);
//生の値を設定する
pc.RawValue = 0;

//新しいインスタンス"1"を追加する
pc.InstanceName = "1";
pc.RawValue = 100;

//インスタンスを削除する
pc.RemoveInstance();

Visual Studioでは、「ツールボックス」の「コンポーネント」内に「PerformanceCounter」があります。フォームデザイナを使って、「PerformanceCounter」コンポーネントをフォームに配置して使用することもできます。

  • 履歴:
  • 2007/1/15 .NET Framework 2.0に関する記述を追加。
  • 2014/1/7 UACに関する記述を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。