You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:24:48