PerformanceCounter获取总CPU使用率数值异常,与任务管理器显示不符求助
解决PerformanceCounter获取CPU使用率不准确的问题
这问题我之前踩过坑!其实是PerformanceCounter的工作原理导致的——它需要两次采样数据才能计算出准确的CPU使用率,第一次调用NextValue()的时候,因为没有历史数据,返回的0(或者偶尔的100这种异常值)其实是无效的。
你说加了MessageBox后返回值正确,是因为弹窗的时候程序暂停了,这段时间足够计数器收集到第二次采样的数据,关闭弹窗后再调用NextValue(),自然就能算出和任务管理器匹配的使用率了。
两种可行的解决办法:
1. 单次调用时先初始化再采样
每次调用函数时,先调用一次NextValue()丢弃初始无效值,等待一小段时间让计数器完成采样,再获取准确值:
private int getCPUUsage() { using (PerformanceCounter cnt = new PerformanceCounter("Processor", "% Processor Time", "_Total")) { // 第一次调用获取初始无效值,直接丢弃 cnt.NextValue(); // 等待100ms让计数器完成一次采样周期 System.Threading.Thread.Sleep(100); // 第二次调用得到准确的CPU使用率 return (int)cnt.NextValue(); } }
2. 缓存计数器实例(更高效)
如果需要多次获取CPU使用率,不要每次都新建PerformanceCounter实例,把它作为类成员缓存起来,初始化时先调用一次NextValue()生成基础采样数据,后续调用直接获取即可:
// 把计数器实例作为类的私有成员缓存 private PerformanceCounter _cpuCounter; // 在类的构造函数中初始化计数器 public YourClassName() { _cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); // 提前调用一次初始化,生成第一次采样数据 _cpuCounter.NextValue(); } private int getCPUUsage() { // 等待一小段时间确保有新的采样数据(连续调用时可根据情况调整时长) System.Threading.Thread.Sleep(100); return (int)_cpuCounter.NextValue(); }
另外要注意,% Processor Time计数器返回的是所有CPU核心的总使用率,和任务管理器显示的“CPU使用率”逻辑一致,这样修改后就能和任务管理器的数值匹配啦~
内容的提问来源于stack exchange,提问作者Ho jun
相关产品推荐
相关产品推荐

