LibreHardwareMonitor代码无法获取GPU传感器数据求助
解决LibreHardwareMonitor无法获取GPU传感器数据的问题
针对你的代码无法获取GPU数据的情况,下面列出几个关键问题及修复方案:
1. 重复定义UpdateVisitor类
你的代码在mynamespace和Program类中分别定义了同名的UpdateVisitor,这会导致类的歧义,且完全没必要重复实现。删除其中一个,保留一个即可。
2. 程序需要管理员权限运行
LibreHardwareMonitor读取GPU传感器数据(尤其是NVIDIA/AMD的硬件)需要管理员权限。右键点击你的程序或Visual Studio,选择“以管理员身份运行”,否则会因为权限不足无法获取GPU数据。
3. 调整硬件启用选项
部分GPU需要启用IsControllerEnabled才能被正确识别,同时确保你的Computer对象初始化时没有遗漏必要的配置:
Computer computer = new Computer { IsCpuEnabled = false, IsGpuEnabled = true, IsMemoryEnabled = false, IsMotherboardEnabled = false, IsControllerEnabled = true, // 开启这个选项,部分GPU依赖控制器识别 IsNetworkEnabled = false, IsStorageEnabled = false, IsPsuEnabled = false };
4. 优化循环逻辑,避免频繁创建Computer实例
你的Main方法中无限循环调用Monitorr,每次都会重新创建并打开/关闭Computer对象,这不仅效率低下,还可能导致硬件访问冲突。应该将Computer的初始化和打开放在循环外,仅在循环内更新数据。
修正后的完整代码
using System; using System.Threading; using LibreHardwareMonitor; using LibreHardwareMonitor.Hardware; namespace mynamespace { public class UpdateVisitor : IVisitor { public void VisitComputer(IComputer computer) { computer.Traverse(this); } public void VisitHardware(IHardware hardware) { hardware.Update(); foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this); } public void VisitSensor(ISensor sensor) { } public void VisitParameter(IParameter parameter) { } } class Program { static void Main(string[] args) { // 只初始化一次Computer Computer computer = new Computer { IsCpuEnabled = false, IsGpuEnabled = true, IsMemoryEnabled = false, IsMotherboardEnabled = false, IsControllerEnabled = true, IsNetworkEnabled = false, IsStorageEnabled = false, IsPsuEnabled = false }; computer.Open(); var updateVisitor = new UpdateVisitor(); while (true) { computer.Accept(updateVisitor); Console.Clear(); // 清屏方便查看实时数据 foreach (IHardware hardware in computer.Hardware) { Console.WriteLine("Hardware: {0} ({1})", hardware.Name, hardware.HardwareType); // 遍历子硬件传感器 foreach (IHardware subHardware in hardware.SubHardware) { Console.WriteLine("\tSubhardware: {0}", subHardware.Name); foreach (ISensor sensor in subHardware.Sensors) { Console.WriteLine("\t\tSensor: {0}, Value: {1:F2}", sensor.Name, sensor.Value ?? 0); } } // 遍历当前硬件传感器 foreach (ISensor sensor in hardware.Sensors) { Console.WriteLine("\tSensor: {0}, Value: {1:F2}", sensor.Name, sensor.Value ?? 0); } } Thread.Sleep(2000); // 每2秒刷新一次 } // 实际这里因为是无限循环,不会执行到,可在退出逻辑中调用 // computer.Close(); } } }
额外检查项
- 确保你使用的LibreHardwareMonitor NuGet包是最新版本(可以通过NuGet包管理器更新)。
- 确认GPU驱动是最新版本,旧驱动可能导致传感器数据无法读取。
- 如果是笔记本电脑的双GPU(集成+独立),确保代码能识别到独立GPU,你可以通过
hardware.HardwareType过滤出HardwareType.GpuNvidia/HardwareType.GpuAmd/HardwareType.GpuIntel类型的硬件。
内容的提问来源于stack exchange,提问作者ba2d35
相关产品推荐
相关产品推荐

