如何使用WMI返回CPU使用率?是从Win32_PerfFormattedData_PerfOS_Processor
中返回PercentProcessorTime
吗?
如果不是,我应该查看哪个类呢?谢谢。
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
似乎也可以工作。
注意:这些通常会针对每个CPU核心返回多个结果,并且必须进行求和/平均以获取整个系统的总CPU使用率,请注意查看。
这个问题和答案实际上与WMI更相关,因为使用C#从WMI获取信息实际上是一个不同的问题,并且对于C#中的任何WMI查询都应该非常相似。
我认为以下代码将会占用全部 CPU 资源
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;
}
}
}