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

本文关键字:程序 几秒 我的 冻结 WMI 获取 CPU 使用率 为什么 | 更新日期: 2023-09-27 18:23:58

我目前使用此代码来获取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秒,然后才最终显示值。然而,经过第一次,代码几乎立即运行。究竟是什么让它在第一次运行时如此缓慢,但在随后的任何一次运行中都没有?

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

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

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