web-dev-qa-db-ja.com

CPUパフォーマンスカウンターが0%のCPU使用率を報告し続けるのはなぜですか?

_PerformanceCounter cpuload = new PerformanceCounter();
cpuload.CategoryName = "Processor";
cpuload.CounterName = "% Processor Time";
cpuload.InstanceName = "_Total";
Console.WriteLine(cpuload.NextValue() + "%");
_

出力は常に0%ですが、_cpuload.RawValue_は736861484375程度ですが、NextValue()で何が起こったのでしょうか?

32
smwikipedia

最後の値と比較するものがないため、カウンターの最初の反復は常に0になります。これを試して:

var cpuload = new PerformanceCounter("Processor", "% Processor Time", "_Total");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");

次に、いくつかのデータが出力されるのを確認する必要があります。それは、一定のグラフまたは更新されたシナリオで見られるように作られています...それが、この問題に頻繁に遭遇しない理由です。

これが MSDNリファレンス です。

NextValue()メソッドは、最初の呼び出しで常に0の値を返します。したがって、このメソッドをもう一度呼び出す必要があります。

42
Nick Craver

最初に最初の値を取得します(0になります)

NextValue();

次に、1000ミリ秒待ちます

Thread.Sleep(1000);

次に、真のCPU使用量である2番目の値を取得します。

NextValue();

コードは次のようになります。

float perfCounterValue = perfCounter.NextValue();

//Thread has to sleep for at least 1 sec for accurate value.
System.Threading.Thread.Sleep(1000);

perfCounterValue = perfCounter.NextValue();

Console.WriteLine("Value: {0}", perfCounterValue);
20
Max