商城首页欢迎来到中国正版软件门户

您的位置:首页 >C# WMI获取CPU内存使用率方法

C# WMI获取CPU内存使用率方法

  发布于2026-02-04 阅读(0)

扫一扫,手机访问

应优先使用Win32_PerfFormattedData_PerfOS_Processor获取CPU使用率,因其提供已格式化的PercentProcessorTime;内存则用Win32_PerfFormattedData_PerfOS_Memory的AvailableMBytes与CommitLimit计算,更准确反映系统压力。

C# WMI查询系统信息方法 C#如何获取CPU和内存使用率

WMI查询CPU使用率:注意Win32_ProcessorLoadPercentage不是实时值

直接读取Win32_Processor.LoadPercentage在多数Windows系统上返回的是0或无效值,因为该属性默认被禁用,需先启用性能计数器或改用更可靠的指标。真实场景中应优先使用Win32_PerfFormattedData_PerfOS_Processor类——它提供已格式化的百分比数据,无需手动计算。

  • 查询语句用:"SELECT Name, PercentProcessorTime FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name='_Total'"
  • Name='_Total'汇总所有逻辑处理器,避免遍历多个CPU0CPU1再平均
  • 首次查询可能延迟几百毫秒,建议初始化后缓存ManagementObjectSearcher实例,避免频繁创建
  • 若需更高频率采样(如每秒),注意WMI本身有开销,连续高频查询可能拖慢系统

获取内存使用率:别只看Win32_OperatingSystemFreePhysicalMemory

Win32_OperatingSystem.FreePhysicalMemory单位是KB,且不包含缓存/备用内存,直接用它算“已用率”会严重高估实际压力。Windows内存管理依赖StandbyModified列表,真正关键的是Win32_PerfFormattedData_PerfOS_Memory中的AvailableMBytesCommitLimit组合。

  • 推荐查询:"SELECT AvailableMBytes, CommitLimit FROM Win32_PerfFormattedData_PerfOS_Memory"
  • 内存使用率 ≈ (CommitLimit - AvailableMBytes) / CommitLimit * 100,这更贴近任务管理器显示逻辑
  • AvailableMBytes含Standby内存,可被快速重用;而FreePhysicalMemory几乎总是极小,无参考价值
  • 注意权限:某些域环境或最小化安装系统可能禁用PerfFormattedData类,需回退到Win32_ComputerSystemTotalPhysicalMemory并配合Win32_OperatingSystemFreePhysicalMemory粗略估算

WMI查询必须处理的异常和权限问题

本地管理员权限不是必须的,但普通用户常因WMI命名空间访问被拒或性能计数器未初始化而失败。错误信息如"Access denied""Invalid namespace""Not found"都指向配置而非代码缺陷。

  • 检查WMI服务是否运行:services.msc中确认Windows Management Instrumentation状态为“正在运行”
  • 验证命名空间是否存在:PowerShell中执行Get-WmiObject -Namespace "root\CIMV2" -Class "__NAMESPACE" | Where-Object Name -eq "PerfFormattedData"
  • 若提示"The RPC server is unavailable",大概率是防火墙拦截了WMI端口(TCP 135 + 动态端口),非远程场景可忽略
  • 在.NET Core/.NET 5+中使用System.Management需额外安装NuGet包System.Management(v6.0.0+),旧版Microsoft.Management.Infrastructure不兼容传统WQL查询

替代方案:用PerformanceCounter更轻量、更稳定

如果只需CPU/内存基础指标,System.Diagnostics.PerformanceCounter比WMI启动快、资源占用低、权限要求松,且数据源完全一致(底层都读PerfMon)。尤其适合后台服务或托盘程序。

  • CPU示例:new PerformanceCounter("Processor", "% Processor Time", "_Total"),调用NextValue()前需Thread.Sleep(1000)确保首次有效
  • 内存示例:new PerformanceCounter("Memory", "Available MBytes"),再用TotalPhysicalMemory计算使用率
  • 注意:首次NextValue()常返回0.0,必须两次采样间隔至少1秒才准;不要在构造后立刻读值
  • 务必调用Dispose()或用using,否则计数器句柄泄漏会导致后续查询变慢甚至失败

WMI路径深、权限杂、返回值含义容易误解,真正在意准确性和响应速度时,PerformanceCounter才是更务实的选择。但若需同时查磁盘型号、BIOS版本等硬件信息,WMI仍是不可替代的入口。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注