我正在尝试使用WMI来检查我的CPU负载(Xeon,4核)。我正在运行XP 64(SP2)。
private void button1_Click(object sender, EventArgs e)
{
Dictionary<string, string> cpuInfo = new Dictionary<string, string>();
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
foreach (ManagementObject queryObj in searcher.Get())
{
cpuInfo.Add("LoadPercentage"+queryObj["DeviceID"].ToString(), queryObj["LoadPercentage"].ToString());
}
foreach (KeyValuePair<string,string> kvp in cpuInfo)
{
richTextBox1.AppendText(String.Format("{0} {1}\n", kvp.Key, kvp.Value));
}
}
上面的示例运行,但速度非常慢,大约5秒钟。这是WMI问题还是我做了一些根本错误的事情?
答案 0 :(得分:0)
好的,我提供这个作为答案,虽然它可能不是 - 但我发现它不适合单独评论。
我在Windows XP SP3和Windows 7上遇到同样的问题。只要在WMI查询中包含LoadPercentage
属性,每个物理处理器运行大约1秒(即Win32_Processor
的实例) 。反之亦然:如果我在查询中包含所有属性,但不包含LoadPercentage
属性,则它会在几毫秒内运行。
使用自定义或操作系统提供的多种工具(即wmic cpu
)可以观察到此行为。
我只能推测原因是什么,它可能与LoadPercentage
的{{3}}有关(强调添加):
每个处理器的负载容量,平均为 最后一秒 。 处理器负载是指每个处理器负载的总计算负担 处理器一次。此属性继承自CIM_Processor。
WMI提供程序的实现实际上可能需要1秒钟才能在您拨打电话时对“平均到最后一秒”的负载百分比进行采样。我猜想提供商会在后台以某种方式做到这一点,并且只返回它在调用时的内容。但无论如何,这只是猜测。
UPDATE :FWIW,Windows 8开发者预览版似乎表现出相同的行为。