次の方法で共有


PerformanceCounterCategory クラス

パフォーマンス カウンタのカテゴリを定義するパフォーマンス オブジェクトを表します。

名前空間: System.Diagnostics
アセンブリ: System (system.dll 内)

構文

'宣言
Public NotInheritable Class PerformanceCounterCategory
'使用
Dim instance As PerformanceCounterCategory
public sealed class PerformanceCounterCategory
public ref class PerformanceCounterCategory sealed
public final class PerformanceCounterCategory
public final class PerformanceCounterCategory

解説

注意

このクラスに適用される HostProtectionAttribute 属性の Resources プロパティの値は、Synchronization または SharedState です。HostProtectionAttribute は、デスクトップ アプリケーション (一般的には、アイコンをダブルクリック、コマンドを入力、またはブラウザに URL を入力して起動するアプリケーション) には影響しません。詳細については、HostProtectionAttribute クラスのトピックまたは「SQL Server プログラミングとホスト保護属性」を参照してください。

メモ重要 :

パフォーマンス カウンタを作成または削除する場合、名前付きミューテックスを使用して基になるコードを同期する必要があります。高度な特権が付与されたアプリケーションが名前付きミューテックスをロックしている場合、パフォーマンス カウンタを作成または削除しようとしても、ロックが解除されるまでアプリケーションは応答しません。この問題を回避するために、信頼関係のないコードには UnmanagedCode アクセス許可を付与しないでください。また、UnmanagedCode アクセス許可を使用すると、他のアクセス許可をバイパスできる可能性もあるため、信頼度の高いコードにだけこのアクセス許可を付与する必要があります。

PerformanceCounterCategory インスタンスの CategoryName プロパティは、パフォーマンス ビューワ アプリケーションの [カウンタの追加] ダイアログ ボックスの [パフォーマンス オブジェクト] ボックスに表示されます。

PerformanceCounterCategory クラスには、コンピュータ上のカウンタおよびカテゴリとやり取りするいくつかのメソッドがあります。Create メソッドを使用すると、カスタム カテゴリを定義できます。Delete メソッドを使用すると、コンピュータからカテゴリを削除できます。GetCategories メソッドを使用すると、カテゴリの一覧を表示できます。ReadCategory を使用すると、単一カテゴリに関連付けられているすべてのカウンタとインスタンスのデータを取得できます。

パフォーマンス カウンタは、アプリケーションに関するパフォーマンス データを発行します。カテゴリには、物理的なコンポーネント (プロセッサ、ディスク、メモリなど) とシステム オブジェクト (プロセス、スレッドなど) が含まれます。同じパフォーマンス オブジェクトに関連するシステム カウンタは、共通のフォーカスを指すカテゴリにグループ化されます。PerformanceCounter クラスのインスタンスを作成するときは、まずコンポーネントがやり取りするカテゴリを指示し、次にカテゴリからカウンタを選択します。

たとえば、Windows カウンタ カテゴリの 1 つに、Memory カテゴリがあります。このカテゴリにあるシステム カウンタは、利用できるバイト数やキャッシュされているバイト数などのメモリのデータを追跡します。アプリケーションでキャッシュされているバイトを操作する場合は、PerformanceCounter コンポーネントのインスタンスを作成し、そのインスタンスを Memory カテゴリに接続し、このカテゴリから適切なカウンタ (この例では Cached Bytes) を選択します。

システムで利用できるカウンタ カテゴリは多数ありますが、頻繁にやり取りするカテゴリは、Cache、Memory、Objects、PhysicalDisk、Process、Processor、Server、System、および Thread です。

メモ重要 :

PerformanceCounter クラスの RemoveInstance メソッドは、カウンタを解放します。そのカテゴリに対して再利用オプションが選択されている場合、カウンタのインスタンスは再利用されます。その結果、別のプロセスまたは別のコードの一部分がカウンタ インスタンスへの書き込みを試行している場合に競合状態が発生する可能性があります。

使用例

PerformanceCounter および PerformanceCounterCategory がローカル コンピュータまたは別のコンピュータに存在するかどうかを判断するコード例を次に示します。この例では、これらのオブジェクトがローカル コンピュータに存在しない場合は必要に応じて作成します。Exists メソッドを使用して、PerformanceCounterCategory が存在するかどうかを判断します。PerformanceCounterCategory が存在せず、カウンタ名が指定されていない場合、またはコンピュータがリモート マシンである場合は終了します。

PerformanceCounter 名が指定されている場合、この例では CounterExists メソッドを使用して結果を表示します。PerformanceCounter が存在しない場合、ユーザーは、PerformanceCounterCategory を削除し、新しい PerformanceCounter で再作成できます。この処理が行われなかった場合は、Delete メソッドによってカテゴリが削除されます。

要求に応じて、この例では Create メソッドを使用して新しい PerformanceCounterCategory および PerformanceCounter を作成します。インスタンス名が指定されている場合は、InstanceExists メソッドを使用して結果を表示します。

Imports System
Imports System.Diagnostics
Imports Microsoft.VisualBasic

Module PerfCounterCatCreateExistMod

    Sub Main(ByVal args() As String)
        Dim categoryName As String = ""
        Dim counterName As String = ""
        Dim instanceName As String = ""
        Dim machineName As String = ""
        Dim categoryHelp As String = ""
        Dim counterHelp As String = ""
        Dim objectExists As Boolean = False
        Dim pcc As PerformanceCounterCategory
        Dim createCategory As Boolean = False

        ' Copy the supplied arguments into the local variables.
        Try
            categoryName = args(0)
            counterName = args(1)
            instanceName = args(2)
            machineName = IIf(args(3) = ".", "", args(3))
            categoryHelp = args(4)
            counterHelp = args(5)
        Catch ex As Exception
            ' Ignore the exception from non-supplied arguments.
        End Try

        ' Verify that the category name is not blank.
        If categoryName.Length = 0 Then
            Console.WriteLine("Category name cannot be blank.")
            Return
        End If

        ' Check whether the specified category exists.
        If machineName.Length = 0 Then
            objectExists = _
                PerformanceCounterCategory.Exists(categoryName)

        Else
            ' Handle the exception that is thrown if the computer 
            ' cannot be found.
            Try
                objectExists = PerformanceCounterCategory.Exists( _
                    categoryName, machineName)
            Catch ex As Exception
                Console.WriteLine("Error checking for existence of " & _
                    "category ""{0}"" on computer ""{1}"":" & vbCrLf & _
                    ex.Message, categoryName, machineName)
                Return
            End Try
        End If

        ' Tell the user whether the specified category exists.
        Console.WriteLine("Category ""{0}"" " & _
            IIf(objectExists, "exists on ", "does not exist on ") & _
            IIf(machineName.Length > 0, _
                "computer ""{1}"".", "this computer."), _
            categoryName, machineName)

        ' If no counter name is given, the program cannot continue.
        If counterName.Length = 0 Then
            Return
        End If

        ' A category can only be created on the local computer.
        If Not objectExists Then
            If machineName.Length > 0 Then
                Return
            Else
                createCategory = True
            End If
        Else
            ' Check whether the specified counter exists.
            If machineName.Length = 0 Then
                objectExists = PerformanceCounterCategory.CounterExists( _
                    counterName, categoryName)
            Else
                objectExists = PerformanceCounterCategory.CounterExists( _
                    counterName, categoryName, machineName)
            End If

            ' Tell the user whether the counter exists.
            Console.WriteLine("Counter ""{0}"" " & _
                IIf(objectExists, "exists", "does not exist") & _
                " in category ""{1}"" on " & _
                IIf(machineName.Length > 0, _
                    "computer ""{2}"".", "this computer."), _
                counterName, categoryName, machineName)

            ' If the counter does not exist, consider creating it.
            If Not objectExists Then

                ' If this is a remote computer, 
                ' exit because the category cannot be created.
                If machineName.Length > 0 Then
                    Return
                Else
                    ' Ask whether the user wants to recreate the category.
                    Console.Write("Do you want to delete and recreate " & _
                        "category ""{0}"" with your new counter? [Y/N]: ", _
                        categoryName)
                    Dim userReply As String = Console.ReadLine()

                    ' If yes, delete the category so it can be recreated later.
                    If userReply.Trim.ToUpper.Chars(0) = "Y" Then
                        PerformanceCounterCategory.Delete(categoryName)
                        createCategory = True
                    Else
                        Return
                    End If
                End If
            End If
        End If

        ' Create the category if it was deleted or it never existed.
        If createCategory Then
            pcc = PerformanceCounterCategory.Create( _
                categoryName, categoryHelp, counterName, counterHelp)

            Console.WriteLine( _
                "Category ""{0}"" with counter ""{1}"" created.", _
                pcc.CategoryName, counterName)

        ElseIf instanceName.Length > 0 Then

            ' If an instance name was given, check whether it exists.
            If machineName.Length = 0 Then
                objectExists = PerformanceCounterCategory.InstanceExists( _
                    instanceName, categoryName)
            Else
                objectExists = PerformanceCounterCategory.InstanceExists( _
                    instanceName, categoryName, machineName)
            End If

            ' Tell the user whether the instance exists.
            Console.WriteLine("Instance ""{0}"" " & _
                IIf(objectExists, "exists", "does not exist") & _
                " in category ""{1}"" on " & _
                IIf(machineName.Length > 0, _
                    "computer ""{2}"".", "this computer."), _
                instanceName, categoryName, machineName)
        End If
    End Sub
End Module
using System;
using System.Diagnostics;
using Microsoft.VisualBasic;

class PerfCounterCatCreateExistMod
{

    public static void Main(string[] args)
    {
        string categoryName = "";
        string counterName = "";
        string instanceName = "";
        string machineName = "";
        string categoryHelp = "";
        string counterHelp = "";
        bool objectExists = false;
        PerformanceCounterCategory pcc;
        bool createCategory = false;

        // Copy the supplied arguments into the local variables.
        try
        {
            categoryName = args[0];
            counterName = args[1];
            instanceName = args[2];
            machineName = args[3]=="."? "": args[3];
            categoryHelp = args[4];
            counterHelp = args[5];
        }
        catch(Exception ex)
        {
            // Ignore the exception from non-supplied arguments.
        }

        // Verify that the category name is not blank.
        if (categoryName.Length==0)
        {
            Console.WriteLine("Category name cannot be blank.");
            return;
        }

        // Check whether the specified category exists.
        if (machineName.Length==0)
        {
            objectExists = PerformanceCounterCategory.Exists(categoryName);

        }
        else
        {
            // Handle the exception that is thrown if the computer 
            // cannot be found.
            try
            {
                objectExists = PerformanceCounterCategory.Exists(categoryName, machineName);
            }
            catch(Exception ex)
            {
                Console.WriteLine("Error checking for existence of " +
                    "category \"{0}\" on computer \"{1}\":"+"\n" +ex.Message, categoryName, machineName);
                return;
            }
        }

        // Tell the user whether the specified category exists.
        Console.WriteLine("Category \"{0}\" "+ (objectExists? "exists on ": "does not exist on ")+
            (machineName.Length>0? "computer \"{1}\".": "this computer."), categoryName, machineName);

        // If no counter name is given, the program cannot continue.
        if (counterName.Length==0)
        {
            return;
        }

        // A category can only be created on the local computer.
        if (!objectExists)
        {
            if (machineName.Length>0)
            {
                return;
            }
            else
            {
                createCategory = true;
            }
        }
        else
        {
            // Check whether the specified counter exists.
            if (machineName.Length==0)
            {
                objectExists = PerformanceCounterCategory.CounterExists(counterName, categoryName);
            }
            else
            {
                objectExists = PerformanceCounterCategory.CounterExists(counterName, categoryName, machineName);
            }

            // Tell the user whether the counter exists.
            Console.WriteLine("Counter \"{0}\" "+(objectExists? "exists": "does not exist")+
                " in category \"{1}\" on "+(machineName.Length>0? "computer \"{2}\".": "this computer."), 
                counterName, categoryName, machineName);

            // If the counter does not exist, consider creating it.
            if (!objectExists)

                // If this is a remote computer, 
                // exit because the category cannot be created.
            {
                if (machineName.Length>0)
                {
                    return;
                }
                else
                {
                    // Ask whether the user wants to recreate the category.
                    Console.Write("Do you want to delete and recreate " +
                        "category \"{0}\" with your new counter? [Y/N]: ", categoryName);
                    string userReply = Console.ReadLine();

                    // If yes, delete the category so it can be recreated later.
                    if (userReply.Trim().ToUpper()=="Y")
                    {
                        PerformanceCounterCategory.Delete(categoryName);
                        createCategory = true;
                    }
                    else
                    {
                        return;
                    }
                }
            }
        }

        // Create the category if it was deleted or it never existed.
        if (createCategory)
        {
            pcc = PerformanceCounterCategory.Create(categoryName, categoryHelp, counterName, counterHelp);

            Console.WriteLine("Category \"{0}\" with counter \"{1}\" created.", pcc.CategoryName, counterName);

        }
        else if(instanceName.Length>0)
        {
            if (machineName.Length==0)
            {
                objectExists = PerformanceCounterCategory.InstanceExists(instanceName, categoryName);
            }
            else
            {
                objectExists = PerformanceCounterCategory.InstanceExists(instanceName, categoryName, machineName);
            }

            // Tell the user whether the instance exists.
            Console.WriteLine("Instance \"{0}\" "+(objectExists? "exists": "does not exist")+
                " in category \"{1}\" on " + (machineName.Length>0? "computer \"{2}\".": "this computer."), 
                instanceName, categoryName, machineName);
        }
    }
}

継承階層

System.Object
  System.Diagnostics.PerformanceCounterCategory

スレッド セーフ

この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。

プラットフォーム

Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。

バージョン情報

.NET Framework

サポート対象 : 2.0、1.1、1.0

参照

関連項目

PerformanceCounterCategory メンバ
System.Diagnostics 名前空間
PerformanceCounter クラス
CounterCreationDataCollection クラス
CounterSample 構造体