Returning CPU usage in WMI using C#

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
foreach (ManagementObject obj in searcher.Get())
{
    var usage = obj["PercentProcessorTime"];
    var name = obj["Name"];
    Console.WriteLine(name +" : " + usage);
}

And for Linq lovers

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
var cpuTimes = searcher.Get()
    .Cast<ManagementObject>()
    .Select(mo => new
        {
            Name = mo["Name"],
            Usage = mo["PercentProcessorTime"]
        }
    )
    .ToArray();

It seems like the info is also available in WMI here:

select LoadPercentage from Win32_Processor

  • https://msdn.microsoft.com/en-us/library/aa394373%28v=vs.85%29.aspx

"Load capacity of each processor, averaged to the last second. Processor loading refers to the total computing burden for each processor at one time."

OR:

select LoadPercentage from CIM_Processor

  • https://msdn.microsoft.com/en-us/library/aa387978(v=vs.85).aspx

"Loading of the processor, averaged over the last minute, in a percentage."

OR:

select PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor also seems to work.


Note: these often return multiple results per CPU core and have to be summed/averaged to get the total CPU usage for the system as a whole, so look for that.

This question and answer really has more to do with WMI since getting info from WMI with C# is really a different question and should be very similar for any WMI query in C#.

Tags:

C#

Wmi