Возврат использования процессора в WMI с использованием C#
Чтобы вернуть использование ЦП с помощью WMI, я должен вернуть PercentProcessorTime из Win32_PerfFormattedData_PerfOS_Processor? Если нет, то к какому классу мне обратиться? Благодарю.
2 ответа
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);
}
И для любителей Linq
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();
Похоже, что информация также доступна в WMI здесь:
"select LoadPercentage from Win32_Processor"
"Нагрузочная способность каждого процессора, усредненная за последнюю секунду. Загрузка процессора относится к общей вычислительной нагрузке для каждого процессора за один раз".
ИЛИ ЖЕ:
"select LoadPercentage from CIM_Processor"
"Загрузка процессора, усредненная за последнюю минуту, в процентах".
ИЛИ ЖЕ:
"select PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor"
тоже похоже на работу.
Примечание: они часто возвращают несколько результатов на ядро ЦП и должны быть суммированы, чтобы получить общее использование ЦП для системы в целом, поэтому обратите внимание на это.
Этот вопрос и ответ на самом деле имеет больше общего с WMI, поскольку получение информации из WMI с C# - это действительно другой вопрос, и он должен быть очень похож на любой запрос WMI в C#.
Я думаю, что ниже будет полная загрузка ЦП
ObjectQuery objQuery = new ObjectQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name=\"_Total\"");
ManagementObjectSearcher mngObjSearch = new ManagementObjectSearcher(CommonSettings.MngScope, objQuery);
ManagementObjectCollection mngObjColl = mngObjSearch.Get();
if (mngObjColl.Count > 0)
{
foreach (ManagementObject mngObject in mngObjColl)
{
try
{
uint cpu_usage = 100 - Convert.ToUInt32(mngObject["PercentIdleTime"]);
break;
}
catch (Exception ex)
{
break;
}
}
}