プロセッサの負荷を取得する必要があるC#アプリケーションがあります。この質問に対する受け入れられた回答によると、私のオプションは、WMIまたはSystem.Diagnostics名前空間のいずれかからのパフォーマンスカウンターを使用することです。System.Diagnosticsパフォーマンスカウンターに問題があるため(ここに記載されています)、唯一のオプションはWMIを使用することです。次のコードは、WMIを使用してプロセッサの負荷を読み取る方法を示しています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
namespace ProcessorUtilizationSpike
{
class Program
{
private static ManagementObject processor;
static void Main(string[] args)
{
processor = new ManagementObject("Win32_PerfFormattedData_PerfOS_Processor.Name='_Total'");
while(true)
{
PrintTimedMeasure();
}
}
static void PrintTimedMeasure()
{
DateTime start = DateTime.Now;
UInt64 wmi = WMIMeasure();
DateTime stop = DateTime.Now;
Console.WriteLine("wmi : " + wmi + ", time: " + (stop - start));
}
static UInt64 WMIMeasure()
{
processor.Get();
return ((UInt64)processor.Properties["PercentProcessorTime"].Value); // this property corresponds to a UInt64, see the Type property.
}
}
}
私の問題は、この典型的な出力スニペットからわかるように、プロセッサの使用率を取得するのに約0.5秒かかることです。
wmi : 6, time: 00:00:00.5156250
wmi : 3, time: 00:00:00.5156250
wmi : 4, time: 00:00:00.5000000
wmi : 3, time: 00:00:00.5156250
wmi : 3, time: 00:00:00.5000000
私の推測では、負荷のサンプリングに非常に時間がかかる理由の少なくとも一部は、Getメソッド呼び出しがManagementObjectオブジェクトの他のプロパティも更新することです。だから私の質問は:Getメソッド呼び出しの更新をより速くするにはどうすればよいですか?解決策は、どういうわけかManagementObjectオブジェクトにプロセッサの負荷プロパティのみを更新するように指示することだと思いますが、その方法がわかりません。
余談ですが、出力のサンプル時間が約0.5秒で非常に安定しているのは不思議ですが、それが解決策のヒントになるかどうかはわかりません。