PerformanceCounter

[C#] PerformanceCounterでCPU使用率を取得する方法

C#でPerformanceCounterを使用してCPU使用率を取得するには、まずSystem.Diagnostics名前空間をインポートします。

次に、PerformanceCounterクラスのインスタンスを作成し、カテゴリ名を”Processor”、カウンタ名を”% Processor Time”、インスタンス名を”_Total”に設定します。

これにより、全プロセッサの平均使用率を取得できます。

NextValueメソッドを呼び出すことで、現在のCPU使用率を取得できますが、正確な値を得るためには、少し待ってから再度NextValueを呼び出す必要があります。

これにより、CPU使用率の変化をリアルタイムで監視できます。

CPU使用率の取得方法

NugetからSystem.Diagnostics.PerformanceCounterを検索してインストールしておく必要があります。

コンソールからの場合は、dotnet add package System.Diagnostics.PerformanceCounterでインストールできます。

必要な名前空間のインポート

C#でCPU使用率を取得するためには、System.Diagnostics名前空間をインポートする必要があります。

この名前空間には、PerformanceCounterクラスが含まれています。

using System.Diagnostics; // PerformanceCounterクラスを使用するため

PerformanceCounterのインスタンス作成

PerformanceCounterクラスのインスタンスを作成することで、CPU使用率を取得する準備が整います。

以下のようにインスタンスを作成します。

PerformanceCounter cpuCounter = new PerformanceCounter();

カウンタの設定

PerformanceCounterを使用するには、いくつかの設定が必要です。

具体的には、カテゴリ名、カウンタ名、インスタンス名を設定します。

カテゴリ名の設定

CPU使用率を取得するためのカテゴリ名は"Processor"です。

このカテゴリには、CPUに関するさまざまなカウンタが含まれています。

cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定

カウンタ名の設定

CPU使用率を取得するためのカウンタ名は"% Processor Time"です。

このカウンタは、CPUの使用率をパーセンテージで示します。

cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定

インスタンス名の設定

インスタンス名は、特定のCPUコアを指定するために使用します。

全体のCPU使用率を取得する場合は、"_Total"を指定します。

cpuCounter.InstanceName = "_Total"; // インスタンス名を設定

CPU使用率の取得

設定が完了したら、実際にCPU使用率を取得します。

NextValueメソッドの使用

NextValueメソッドを使用して、CPU使用率の値を取得します。

このメソッドは、呼び出すたびに最新の値を返します。

float cpuUsage = cpuCounter.NextValue(); // CPU使用率を取得

正確な値を得るための注意点

NextValueメソッドを初めて呼び出した際には、正確な値が得られないことがあります。

最初の呼び出しの後に、少し待ってから再度呼び出すことで、正確な値を取得できます。

System.Threading.Thread.Sleep(1000); // 1秒待機
float cpuUsage = cpuCounter.NextValue(); // 再度CPU使用率を取得

このようにして、C#を使用してCPU使用率を取得することができます。

実装例

シンプルなコンソールアプリケーション

以下は、シンプルなコンソールアプリケーションでCPU使用率を取得する例です。

このプログラムは、1秒ごとにCPU使用率を表示します。

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定
        cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定
        cpuCounter.InstanceName = "_Total"; // インスタンス名を設定
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // 結果を表示
            Console.WriteLine($"CPU使用率: {cpuUsage}%");
        }
    }
}
CPU使用率: 5.0%
CPU使用率: 10.0%
CPU使用率: 15.0%
...

Windowsフォームアプリケーションでの使用

WindowsフォームアプリケーションでCPU使用率を表示するための例です。

このプログラムは、ラベルにCPU使用率を表示します。

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Timers;
public class CpuUsageForm : Form
{
    private Label cpuUsageLabel;
    private PerformanceCounter cpuCounter;
    private System.Timers.Timer timer;
    public CpuUsageForm()
    {
        // ラベルの初期化
        cpuUsageLabel = new Label();
        cpuUsageLabel.Font = new System.Drawing.Font("Arial", 24);
        cpuUsageLabel.Dock = DockStyle.Fill;
        cpuUsageLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
        Controls.Add(cpuUsageLabel);
        // PerformanceCounterのインスタンスを作成
        cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定
        cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定
        cpuCounter.InstanceName = "_Total"; // インスタンス名を設定
        // タイマーの設定
        timer = new System.Timers.Timer(1000); // 1秒ごとに更新
        timer.Elapsed += UpdateCpuUsage;
        timer.Start();
    }
    private void UpdateCpuUsage(object sender, ElapsedEventArgs e)
    {
        // CPU使用率を取得
        float cpuUsage = cpuCounter.NextValue();
        // UIスレッドでラベルを更新
        Invoke(new Action(() => cpuUsageLabel.Text = $"CPU使用率: {cpuUsage}%"));
    }
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new CpuUsageForm());
    }
}

リアルタイムモニタリングの実装

リアルタイムでCPU使用率をモニタリングし、一定の閾値を超えた場合にアラートを表示するプログラムの例です。

using System;
using System.Diagnostics;
using System.Threading;
class RealTimeCpuMonitor
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定
        cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定
        cpuCounter.InstanceName = "_Total"; // インスタンス名を設定
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // CPU使用率が80%を超えた場合にアラートを表示
            if (cpuUsage > 80)
            {
                Console.WriteLine("警告: CPU使用率が高いです!使用率: " + cpuUsage + "%");
            }
            else
            {
                Console.WriteLine($"CPU使用率: {cpuUsage}%");
            }
        }
    }
}
CPU使用率: 75.0%
CPU使用率: 82.0%
警告: CPU使用率が高いです!使用率: 82.0%
CPU使用率: 70.0%
...

これらの実装例を参考にして、C#でCPU使用率を取得し、さまざまなアプリケーションに応用することができます。

応用例

複数のカウンタを使用したシステムモニタリング

複数のカウンタを使用して、CPU使用率だけでなく、メモリ使用率やディスク使用率なども同時にモニタリングすることができます。

以下は、CPUとメモリの使用率を取得する例です。

using System;
using System.Diagnostics;
using System.Threading;
class SystemMonitor
{
    static void Main()
    {
        // CPU PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        // メモリ PerformanceCounterのインスタンスを作成
        PerformanceCounter ramCounter = new PerformanceCounter("Memory", "Available MBytes");
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // 利用可能なメモリを取得
            float availableMemory = ramCounter.NextValue();
            // 結果を表示
            Console.WriteLine($"CPU使用率: {cpuUsage}%, 利用可能メモリ: {availableMemory}MB");
        }
    }
}
CPU使用率: 10.0%, 利用可能メモリ: 2048MB
CPU使用率: 15.0%, 利用可能メモリ: 2000MB
...

ログファイルへのCPU使用率の記録

CPU使用率を定期的に取得し、ログファイルに記録するプログラムの例です。

これにより、後で分析するためのデータを蓄積できます。

using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
class CpuUsageLogger
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        // ログファイルのパス
        string logFilePath = "cpu_usage_log.txt";
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // ログファイルに記録
            File.AppendAllText(logFilePath, $"{DateTime.Now}: CPU使用率: {cpuUsage}%\n");
        }
    }
}

このプログラムを実行すると、cpu_usage_log.txtというファイルにCPU使用率が記録されます。

アラートシステムの構築

CPU使用率が特定の閾値を超えた場合に、アラートを表示するシステムを構築することができます。

以下は、CPU使用率が80%を超えた場合にアラートを表示する例です。

using System;
using System.Diagnostics;
using System.Threading;
class CpuAlertSystem
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // CPU使用率が80%を超えた場合にアラートを表示
            if (cpuUsage > 80)
            {
                Console.WriteLine($"警告: CPU使用率が高いです!使用率: {cpuUsage}%");
            }
            else
            {
                Console.WriteLine($"CPU使用率: {cpuUsage}%");
            }
        }
    }
}
CPU使用率: 75.0%
CPU使用率: 82.0%
警告: CPU使用率が高いです!使用率: 82.0%
CPU使用率: 70.0%
...

これらの応用例を通じて、C#を使用してシステムのパフォーマンスを監視し、必要に応じてアクションを取ることができるようになります。

まとめ

この記事では、C#を使用してCPU使用率を取得する方法や、実際のアプリケーションでの実装例、さらには応用例について詳しく解説しました。

これにより、システムのパフォーマンスを監視するための具体的な手法を理解することができるでしょう。

今後は、これらの知識を活用して、より効率的なシステムモニタリングやパフォーマンス管理を行ってみてください。

Back to top button
目次へ