Christopher Smit Ответов: 1

Получение температуры процессора с помощью C#


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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace SServer.Common.Diagnostics.SystemInfo
{
    public class Temperature
    {
        public double CurrentValue { get; set; }
        public string InstanceName { get; set; }
        public static List<string> Temperatures
        {
            get
            {
                List<string> result = new List<string>();

                ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_TemperatureProbe");

                foreach (ManagementObject obj in searcher.Get())
                {
                    if (obj != null)
                    {
                        Double temp = Convert.ToDouble(obj["CurrentTemperature"].ToString());

                        temp = (temp - 2732) / 10.0;

                        result.Add(new Temperature
                        {
                            CurrentValue = temp,
                            InstanceName = obj["CurrentTemperature"].ToString()
                        }.ToString());
                    }
                }
                return result;
            }
        }
    }
}

[no name]

Какая проблема?

Christopher Smit

Двойная температура = преобразование.ToDouble(obj["CurrentTemperature"].Метод toString());

В этой строке указывается следующим исключением.

Исключение ManagementException было необработано - не найдено

Richard MacCutchan

Выглядит как obj["CurrentTemperature"] не существует.

1 Ответов

Рейтинг:
2

OriginalGriff

CurrentTemperature не существует - это CurrentReading.

Но у меня есть еще одна плохая новость для вас: это, вероятно, тоже не сработает.
См. MSDN: Класс Win32_TemperatureProbe[^]

"Большая часть информации, которую предоставляет WMI-класс Win32_TemperatureProbe, поступает из SMBIOS. Показания в реальном времени для свойства CurrentReading не могут быть извлечены из таблиц SMBIOS. По этой причине текущие реализации WMI не заполняют свойство CurrentReading. Наличие свойства CurrentReading зарезервировано для будущего использования."


Christopher Smit

Неужели нет никакого способа сделать это? Я имею в виду, что должно быть что-то... Так ведь?

OriginalGriff

Насколько я знаю, Нет, нет никакого общего способа получить это. Проблема в том, что WMI (et al) полагаются на производителей материнских плат, предоставляющих эту информацию через свои драйверы, и большинство из них не беспокоятся.
Возьмите google, и вы поймете, что я имею в виду.
Извините, что принес плохие новости, но.....

Christopher Smit

Ну, это отстой.. Было бы довольно эпично сделать это.. В любом случае спасибо :)

Christopher Smit

Я провел небольшое исследование.. Как такие программы, как CPUID, получают температуру процессора?

Urutar

Они реализовали функции, используя документацию для конкретных API от производителей различных компонентов.

Более подробную информацию о чем-то подобном вы можете найти здесь:
http://stackoverflow.com/a/9564862/1648463

Речь идет об открытом аппаратном мониторе, который представляет собой библиотеку с открытым исходным кодом и приложение, которое вы могли бы использовать.

CPallini

5.