Возврат использования процессора в 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;
            }
        }
     }
Другие вопросы по тегам