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

The output is always 0%, while the cpuload.RawValue is like 736861484375 or so, what happened at NextValue()?

Breeze
  • 2,010
  • 2
  • 32
  • 43
smwikipedia
  • 61,609
  • 92
  • 309
  • 482

2 Answers2

53

The first iteration of the counter will always be 0, because it has nothing to compare to the last value. Try this:

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() + "%");

Then you should see some data coming out. It's made to be seen in a constant graph or updated scenario...that's why you don't come across this problem often.

Here's the MSDN reference:

The method nextValue() always returns a 0 value on the first call. So you have to call this method a second time.

alamoot
  • 1,966
  • 7
  • 30
  • 50
Nick Craver
  • 623,446
  • 136
  • 1,297
  • 1,155
24

First retrieve first value (would be 0)

NextValue();

Then wait for 1000 milisec

Thread.Sleep(1000);

Then retrieve second value which is the true cpu usage.

NextValue();

The code should look like this:

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);
sth
  • 222,467
  • 53
  • 283
  • 367
Max
  • 241
  • 2
  • 3