使用LibreHardwareMonitor获取GPU使用率始终为0的问题求助
解决LibreHardwareMonitor获取GPU负载始终为0的问题
问题原因分析
- 自定义Visitor未正确触发数据更新:你实现的
GetGPULoad类中VisitSensor为空,且依赖hardware.Update()的方式没有完整刷新传感器数据,导致获取的是初始的0值。 - 传感器筛选逻辑不精准:GPU存在多个
SensorType.Load类型的传感器(如核心、显存、编码器负载),你的代码会遍历所有这类传感器,最后可能覆盖为非核心负载的0值。 - 权限不足:读取GPU硬件状态需要管理员权限,非管理员运行时无法获取真实数据,返回默认0值。
- 未检查传感器值的有效性:传感器
Value是可空类型,直接ToString可能拿到空值或默认0。
解决方法及修正代码
1. 简化数据刷新逻辑,移除自定义Visitor
LibreHardwareMonitor内置的Computer.Update()方法会自动完成所有硬件和传感器的数据刷新,无需自定义Visitor类。
2. 精准筛选GPU核心负载传感器
只针对GPU核心的负载传感器进行读取,避免获取其他无关传感器的0值。
3. 确保程序以管理员身份运行
右键程序选择「以管理员身份运行」,或在项目中配置强制管理员权限:
- Visual Studio中打开项目属性 → 安全性 → 启用ClickOnce安全设置
- 编辑
app.manifest,将requestedExecutionLevel改为:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
修正后的完整代码
using LibreHardwareMonitor.Hardware; // 初始化Computer实例,仅启用GPU监测 Computer computer = new Computer { IsGpuEnabled = true }; computer.Open(); // 直接调用Update刷新所有硬件及传感器数据 computer.Update(); foreach (IHardware hardware in computer.Hardware) { // 匹配所有类型的GPU硬件 if (hardware.HardwareType is HardwareType.GpuNvidia or HardwareType.GpuAmd or HardwareType.GpuIntel) { foreach (ISensor sensor in hardware.Sensors) { // 筛选GPU核心负载传感器(名称通常包含"Core") if (sensor.SensorType == SensorType.Load && sensor.Name.Contains("Core", StringComparison.OrdinalIgnoreCase)) { // 确保传感器值不为空后再赋值 if (sensor.Value.HasValue) { GPUload.Text = $"{sensor.Value.Value:F1}%"; } // 找到目标传感器后跳出循环,避免被其他传感器覆盖 break; } } } } computer.Close();
额外注意事项
- 确保使用最新稳定版的LibreHardwareMonitor NuGet包,旧版本可能对新GPU型号支持不足。
- 如果仍无法获取数据,检查GPU驱动是否为最新版本,驱动过旧可能导致硬件监测失败。
内容的提问来源于stack exchange,提问作者Alder
相关产品推荐
相关产品推荐

