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

求助:Performance Counter完全无法工作的问题排查

嘿,我来帮你搞定这个Performance Counter的问题!看起来你遇到了两个核心问题:设计器里看不到可选的计数器列表,以及代码里没法正确获取计数器数值,咱们一步步来解决。

一、先解决设计器无计数器列表的问题

这大概率是权限或系统计数器损坏导致的,试试这几个办法:

  • 以管理员身份运行VS:性能计数器需要系统级权限才能读取完整的计数器列表,右键Visual Studio图标,选「以管理员身份运行」,重新打开项目再看设计器。
  • 重建系统性能计数器:如果系统的计数器注册表损坏了,打开管理员命令提示符,运行这条命令修复:
    lodctr /R
    
    执行完后重启VS,应该就能看到可选列表了。
  • 切换目标平台:如果你的项目是Any CPU,改成x64试试——很多系统性能计数器是64位的,32位进程访问会有兼容性问题。在项目属性→生成→目标平台里选择x64。

二、代码里的错误修正

你的代码里有两个明显的问题,直接导致看不到数据:

  1. 你把实际的计数器实例都注释掉了,只用了设计器拖的performanceCounter1/performanceCounter2,但这些控件根本没配置正确的计数器参数;
  2. Tick事件里直接调用ToString(),这只会输出控件的类名,而不是计数器的实际数值,得用NextValue()方法。

给你个修正后的代码示例,直接用手动实例化的方式更可靠:

using System;
using System.Diagnostics;
using System.Windows.Forms;
using Microsoft.WindowsAzure.Diagnostics;

namespace MonitorC
{
    public partial class Form1 : MetroFramework.Forms.MetroForm
    {
        private PerformanceCounter _perfCPUCounter;
        private PerformanceCounter _perfRAMCounter;

        public Form1()
        {
            InitializeComponent();
            // 初始化计数器,参数要对应正确的类别、计数器名和实例
            _perfCPUCounter = new PerformanceCounter("Processor Information", "% Processor Time", "_Total");
            _perfRAMCounter = new PerformanceCounter("Memory", "Available MBytes");
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // 获取计数器数值,格式化后显示
            float cpuUsage = _perfCPUCounter.NextValue();
            float availableRam = _perfRAMCounter.NextValue();
            
            CPUusage.Text = $"CPU使用率: {cpuUsage:F2}%";
            RAMusage.Text = $"可用内存: {availableRam:F0} MB";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
            // 注意:第一次调用NextValue()会返回0,先预热一次
            _perfCPUCounter.NextValue();
            _perfRAMCounter.NextValue();
        }
    }
}

三、如果想用设计器拖的控件

要是你不想手动实例化,想继续用设计器的控件,那得给控件配置正确的参数:

  1. 确保VS以管理员运行,选中performanceCounter1,在属性窗口里:
    • CategoryName设为Processor Information
    • CounterName设为% Processor Time
    • InstanceName设为_Total
  2. 同理给performanceCounter2配置:CategoryName为Memory,CounterName为Available MBytes
  3. 然后在Tick事件里改成这样:
    CPUusage.Text = $"CPU: {performanceCounter1.NextValue():F2}%";
    RAMusage.Text = $"可用内存: {performanceCounter2.NextValue():F0} MB";
    

小提醒

性能计数器第一次调用NextValue()会返回0,因为它需要先收集一次基准数据,所以在Form_Load里先调用一次预热,这样Tick事件里第一次就能拿到正确的数值啦。

相关截图说明:

  • 图1:设计器中Performance Counter无可选计数器列表的界面
  • 图2:拖入窗体后控件仅显示类名的界面
  • 图3:代码中注释了计数器实例的界面
  • 图4:当前代码的界面

内容的提问来源于stack exchange,提问作者陳柏睿

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:22:05