私は過去に WMI、負の CPU 使用率の値、および Timestamp_Sys100NS を見てきましたが、起動時間だけで 2 つの読み取り値の間のデルタ時間については何もしていません。
CPU 使用率が非常に低い場合、つまりシステム アイドル プロセスが 99% と表示される場合、CPU 使用率の読み取り値がマイナスになります。
MSDN の記事のコードと式を採用しましたが、なぜ間違っているのかわかりません。
http://msdn.microsoft.com/en-us/library/aa392397%28VS.85%29.aspx
一番下のコメントアウトされた行は、0 または 100 の結果しか与えていませんでした。これは、整数の丸めまたは同様のものが原因であると思われるため、分割する前に double として別々の部分に分割しました。
ulong N1 = 0;
ulong D1 = 0;
ulong N2 = 0;
ulong D2 = 0;
ManagementScope scope = new ManagementScope("\\\\" + Machine + "\\root\\cimv2");
scope.Connect();
WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT PercentProcessorTime, TimeStamp_Sys100NS FROM Win32_PerfRawData_PerfOS_Processor Where Name = '_Total'");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, wqlQuery);
foreach (ManagementObject proc in searcher.Get())
{
N1 = ulong.Parse(proc.Properties["PercentProcessorTime"].Value.ToString());
D1 = ulong.Parse(proc.Properties["TimeStamp_Sys100NS"].Value.ToString());
}
System.Threading.Thread.Sleep(500);
foreach (ManagementObject proc in searcher.Get())
{
N2 = ulong.Parse(proc.Properties["PercentProcessorTime"].Value.ToString());
D2 = ulong.Parse(proc.Properties["TimeStamp_Sys100NS"].Value.ToString());
}
double cpu = N2 - N1;
double time = D2 - D1;
var x = (1 - (cpu / time)) * 100;
//var x = (1 - ((N2 - N1) / (D2 - D1))) * 100;
context.Response.Write(x);