我正在尝试使用 OpenHardwareMonitor 在 Windows 服务项目中获取 CPU 温度,但在将代码作为服务运行时它无法正常工作。
在查看如何在 C# 中读取 CPU 温度时,我偶然发现了这个线程:如何获取 CPU 温度?
Win32_TemperatureProbe 似乎不起作用,并且 MSAcpi_ThermalZoneTemperature 总是返回相同的低值,所以我自然在回复中尝试了 OpenHardwareMonitor 解决方案。它在作为具有最高可用请求执行级别的控制台应用程序运行时工作,但在作为安装以使用 LocalSystem 的 Windows 服务运行时不起作用。
using OpenHardwareMonitor.Hardware;
namespace Monitoring_Service
{
public class Computer
{
...
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) { }
}
internal float GetTemperature()
{
var temp = 0f;
UpdateVisitor updateVisitor = new UpdateVisitor();
Computer computer = new Computer();
computer.Open();
computer.CPUEnabled = true;
computer.Accept(updateVisitor);
for (int i = 0; i < computer.Hardware.Length; i++)
{
if (computer.Hardware[i].HardwareType == HardwareType.CPU)
{
for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
{
if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature)
temp = computer.Hardware[i].Sensors[j].Value.GetValueOrDefault();
}
}
}
computer.Close();
return temp;
}
}
}
当我在控制台应用程序中以管理员计算机的身份运行它时。Hardware[i].Sensors 有 19 个项目,0-4 是负载,5-9 是温度,10-13 是时钟等等。因此 if 语句成功并设置了 temp 变量。
当我运行与 Windows 服务相同的代码并调试时,传感器列表仅包含 5 个项目,0-4 是加载的。怎么会这样?