2014-09-21 62 views
0

我目前使用此代码,让我的CPU在四个核的使用值,并显示每一个以他们自己的标签:为什么使用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秒钟后才显示出来。然而,这是第一次,代码立即运行。到底发生了什么事情,使其在第一次运行时变得如此缓慢,而不是随后的运行?

+0

我确实看到了这样的延迟。不可能钉上它,但它重复得太差。改为考虑PerformanceCounter。 – 2014-09-21 12:31:27

+0

我想我可能只需要欢呼。 – dantdj 2014-09-21 12:31:51

回答

1

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

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

+0

我明白了......这有点痛苦。虽然感谢您的知识!赞赏。 – dantdj 2014-09-21 12:30:47

相关问题