侧边栏壁纸
  • 累计撰写 185 篇文章
  • 累计创建 77 个标签
  • 累计收到 17 条评论

目 录CONTENT

文章目录

C#中如何通过代码获取当前机器CPU的温度

码峰
2022-09-28 / 0 评论 / 0 点赞 / 1,682 阅读 / 645 字 / 正在检测是否收录...
广告 广告

问题描述

有时候,我们需要为应用程序收集一些系统的信息,使用C#很容易获得可用内存和CPU负载之类的信息,但不幸的是,CPU温度不是那么容易,之前也尝试使用WMI,但无法获取。

问题解决

Open Hardware Monitor

Open Hardware Monitor是一款免费的开源软件,可监测温度传感器、风扇速度、电压、负载和计算机时钟速度。Open Hardware Monitor支持当今主板上的大多数硬件监控芯片。CPU温度可以通过读取Intel和AMD处理器的核心温度传感器进行监测。可以显示ATI和Nvidia视频卡的传感器以及SMART硬盘温度。监视的值可以显示在主窗口、可自定义的桌面小工具或系统托盘中。免费Open Hardware Monitor软件在32位和64位Microsoft Windows XP/Vista/7/8/8.1/10以及任何基于x86的Linux操作系统上运行,无需安装。网址:https://openhardwaremonitor.org/
同时Open Hardware Monitor还提供了C#的动态库可以使用,在C#中我们可以借助这个动态库来获取CPU的问题。
image-1664417716478

如何使用?

通过nuget安装

在工程的nuget包管理中搜索OpenHardwareMonitor,安装如下图所示的包即可:
image-1664417302845

使用参考代码

首先新建一个C#类CpuTemperatureReader:

internal sealed class CpuTemperatureReader : IDisposable
{
    private readonly Computer _computer;

    public CpuTemperatureReader()
    {
        _computer = new Computer { CPUEnabled = true };
        _computer.Open();
    }

    public IReadOnlyDictionary<string, float> GetTemperaturesInCelsius()
    {
        var coreAndTemperature = new Dictionary<string, float>();

        foreach (var hardware in _computer.Hardware)
        {
            hardware.Update(); //use hardware.Name to get CPU model
            foreach (var sensor in hardware.Sensors)
            {
                if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
                    coreAndTemperature.Add(sensor.Name, sensor.Value.Value);
            }
        }

        return coreAndTemperature;
    }

    public void Dispose()
    {
        try
        {
            _computer.Close();
        }
        catch (Exception)
        {
            //ignore closing errors
        }
    }
}

调用示例:

public static void Main()
{
    while (true)
    {
        CpuTemperatureReader ctr = new CpuTemperatureReader();
        var ts = ctr.GetTemperaturesInCelsius();
        foreach (var t in ts)
        {
              Console.WriteLine("{0}-{1} ℃", t.Key, t.Value);
        }
       Thread.Sleep(1000);
    }
}

以上代码每个1秒中更新获取一次CPU的问题并打印出来,运行结果示例如下:

CPU Core #1-95 ℃
CPU Core #2-91 ℃
CPU Core #3-89 ℃
CPU Core #4-93 ℃
CPU Core #5-83 ℃
CPU Core #6-88 ℃
CPU Package-95 ℃
CPU Core #1-96 ℃
CPU Core #2-91 ℃
CPU Core #3-89 ℃
CPU Core #4-94 ℃
CPU Core #5-87 ℃
CPU Core #6-89 ℃
CPU Package-97 ℃

以上就是获取到的每个核心的问题和CPUPackage的温度值。

注:这个程序需要已管理员身份运行,否则可能会获取失败。

0
广告 广告

评论区