求助:Performance Counter完全无法工作的问题排查
嘿,我来帮你搞定这个Performance Counter的问题!看起来你遇到了两个核心问题:设计器里看不到可选的计数器列表,以及代码里没法正确获取计数器数值,咱们一步步来解决。
一、先解决设计器无计数器列表的问题
这大概率是权限或系统计数器损坏导致的,试试这几个办法:
- 以管理员身份运行VS:性能计数器需要系统级权限才能读取完整的计数器列表,右键Visual Studio图标,选「以管理员身份运行」,重新打开项目再看设计器。
- 重建系统性能计数器:如果系统的计数器注册表损坏了,打开管理员命令提示符,运行这条命令修复:
执行完后重启VS,应该就能看到可选列表了。lodctr /R - 切换目标平台:如果你的项目是Any CPU,改成x64试试——很多系统性能计数器是64位的,32位进程访问会有兼容性问题。在项目属性→生成→目标平台里选择x64。
二、代码里的错误修正
你的代码里有两个明显的问题,直接导致看不到数据:
- 你把实际的计数器实例都注释掉了,只用了设计器拖的
performanceCounter1/performanceCounter2,但这些控件根本没配置正确的计数器参数; - 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(); } } }
三、如果想用设计器拖的控件
要是你不想手动实例化,想继续用设计器的控件,那得给控件配置正确的参数:
- 确保VS以管理员运行,选中
performanceCounter1,在属性窗口里:CategoryName设为Processor InformationCounterName设为% Processor TimeInstanceName设为_Total
- 同理给
performanceCounter2配置:CategoryName为Memory,CounterName为Available MBytes - 然后在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,提问作者陳柏睿
相关产品推荐
相关产品推荐

