There are two options to do this.
First one is to use WMI
var searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
var cpuUsages = searcher.Get()
.Cast<ManagementObject>()
.Select(x => new
{
Name = x["Name"],
Usage = x["PercentProcessorTime"]
}
)
.ToList();
var totalUsage = cpuUsages.Where(x => x.Name.ToString() == "_Total").Select(x => x.Usage).SingleOrDefault();
The second is to use a PerformanceCounter foreach core.
int processorCores = new ManagementObjectSearcher("Select * from Win32_Processor").Get().Cast<ManagementBaseObject>().Sum(item => int.Parse(item["NumberOfCores"].ToString()));
var performanceCounter = new PerformanceCounter[processorCores];
for (var i = 0; i < processorCores; i++)
{
performanceCounter[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
}