Как узнать температуру процессора с помощью OpenHardwareMonitor из службы Windows? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь использовать OpenHardwareMonitor для получения температуры процессора в проекте службы Windows, но он работает неправильно при запуске кода в качестве службы.

Оглядываясь вокруг, как считывать температуру процессора в C #, я наткнулся на этот поток: Как узнать температуру процессора?

Win32_TemperaProbe, похоже, не работает, и MSAcpi_ThermalZoneTempera всегда возвращал одно и то же низкое значение, поэтому, естественно, я попробовал решение OpenHardwareMonitor в ответах. Он работает при запуске в качестве консольного приложения с наивысшим доступным запрашиваемым уровнем выполнения, но не при работе в качестве службы Windows, установленной для использования LocalSystem.

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;
        }
    }
}

Когда я запускаю это в консольном приложении в качестве компьютера администратора. Аппаратное обеспечение [i]. Датчики имеют 19 элементов, 0-4 - нагрузка, 5-9 - температура, 10-13 - часы и т. Д. Таким образом, оператор if успешно выполняется и переменная temp установлена.

Когда я запускаю тот же код, что и служба Windows, и отлаживаю, список датчиков содержит только 5 элементов, 0-4, которые загружаются. Как это может быть?

...