为什么使用WMI来获取CPU使用率会冻结我的程序几秒钟?

时间:2014-09-21 11:52:22

标签: c# wmi

我目前使用此代码获取CPU中四个核心的使用价值,并将每个核心显示在自己的标签上:

            string[] cpuUsage = new string[100];
            int i = 0;

            //Get CPU usage values using WMI
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
            foreach (ManagementObject obj in searcher.Get())
            {
                cpuUsage[i] = obj["PercentProcessorTime"].ToString();
                i++;
            }

            LA_Core1.Content = "Core usage: " + cpuUsage[0] + "%";
            LA_Core2.Content = "Core usage: " + cpuUsage[1] + "%";
            LA_Core3.Content = "Core usage: " + cpuUsage[2] + "%";
            LA_Core4.Content = "Core usage: " + cpuUsage[3] + "%";

但是,第一次运行此代码时,它会冻结我的程序大约10秒钟,然后才能显示该值。然而,在第一次过去时,代码会立即运行。这里到底发生了什么事情,使它在第一次运行时变得如此缓慢,而不是在任何后续运行中?

1 个答案:

答案 0 :(得分:1)

当您使用WMI查询计算机上的某些内容时,它将执行该查询,并且在返回结果之前不会执行任何操作。为了防止这种情况,您可以使用多线程,这样您就可以在不将程序锁定的情况下运行查询。

至于执行查询的时间,有时发生在我身上,我只能假设本地机器缓存有一定程度的结果。因此,后续搜索会更快。您可能还会注意到,如果关闭程序并重新测试操作时间,则会刷新缓存,因此第一个查询将花费很长时间。