C# 实时查看硬件使用率(CPU 内存 硬盘 网络)

一、整体架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    硬件资源监控系统                         │
├─────────────────────────────────────────────────────────────┤
│  数据采集层   │  业务逻辑层   │  展示层        │  告警层    │
│               │               │                │            │
│  • PerformanceCounter        │  • 数据缓存    │  • WinForms │
│  • WMI (ManagementObject)   │  • 定时采样    │  • WPF      │
│  • System.Diagnostics       │  • 历史记录    │  • 上位机   │
│  • SNMP / SSH (远程)        │  • 阈值判断    │  • Web API  │
└─────────────────────────────────────────────────────────────┘

二、方案一:本机实时监控

适合:上位机、工业PC、边缘网关

2.1 核心类(HardwareMonitor.cs)

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;
using System.Threading;

namespace HardwareMonitor
{
    public class HardwareMonitor
    {
        private readonly Timer _timer;
        private readonly int _intervalMs;

        public delegate void HardwareDataHandler(HardwareData data);
        public event HardwareDataHandler OnDataUpdated;

        public HardwareMonitor(int intervalMs = 1000)
        {
            _intervalMs = intervalMs;
            _timer = new Timer(Collect, null, Timeout.Infinite, Timeout.Infinite);
        }

        public void Start() => _timer.Change(0, _intervalMs);
        public void Stop() => _timer.Change(Timeout.Infinite, Timeout.Infinite);

        private void Collect(object state)
        {
            var data = new HardwareData
            {
                CpuUsage = GetCpuUsage(),
                MemoryUsedMb = GetMemoryUsed(),
                MemoryTotalMb = GetMemoryTotal(),
                DiskUsage = GetDiskUsage(),
                NetworkSentKBps = GetNetworkSent(),
                NetworkReceivedKBps = GetNetworkReceived(),
                Temperature = GetCpuTemperature()
            };

            OnDataUpdated?.Invoke(data);
        }

        #region CPU
        private float GetCpuUsage()
        {
            using var cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");
            cpu.NextValue();
            Thread.Sleep(100);
            return cpu.NextValue();
        }
        #endregion

        #region Memory
        private float GetMemoryUsed()
        {
            using var mem = new PerformanceCounter("Memory", "Committed Bytes");
            return mem.NextValue() / 1024 / 1024;
        }

        private float GetMemoryTotal()
        {
            using var mem = new PerformanceCounter("Memory", "Commit Limit");
            return mem.NextValue() / 1024 / 1024;
        }
        #endregion

        #region Disk
        private float GetDiskUsage()
        {
            using var disk = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
            disk.NextValue();
            Thread.Sleep(100);
            return disk.NextValue();
        }
        #endregion

        #region Network
        private float GetNetworkSent()
        {
            using var net = new PerformanceCounter("Network Interface", "Bytes Sent/sec", GetNetworkCard());
            return net.NextValue() / 1024;
        }

        private float GetNetworkReceived()
        {
            using var net = new PerformanceCounter("Network Interface", "Bytes Received/sec", GetNetworkCard());
            return net.NextValue() / 1024;
        }

        private string GetNetworkCard()
        {
            using var searcher = new ManagementObjectSearcher("SELECT Name FROM Win32_NetworkAdapter WHERE NetEnabled = true");
            foreach (ManagementObject obj in searcher.Get())
                return obj["Name"].ToString();
            return "";
        }
        #endregion

        #region Temperature (WMI)
        private float GetCpuTemperature()
        {
            try
            {
                using var searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT CurrentTemperature FROM MSAcpi_ThermalZoneTemperature");
                foreach (ManagementObject obj in searcher.Get())
                {
                    var temp = Convert.ToDouble(obj["CurrentTemperature"].ToString());
                    return (float)(temp / 10.0 - 273.15); // Kelvin → Celsius
                }
            }
            catch { }
            return 0;
        }
        #endregion
    }

    public class HardwareData
    {
        public float CpuUsage { get; set; }
        public float MemoryUsedMb { get; set; }
        public float MemoryTotalMb { get; set; }
        public float DiskUsage { get; set; }
        public float NetworkSentKBps { get; set; }
        public float NetworkReceivedKBps { get; set; }
        public float Temperature { get; set; }

        public override string ToString()
        {
            return $"CPU:{CpuUsage:F1}%  MEM:{MemoryUsedMb:F0}/{MemoryTotalMb:F0}MB  DISK:{DiskUsage:F1}%  TEMP:{Temperature:F1}℃";
        }
    }
}

三、WPF 实时显示

3.1 MainWindow.xaml

xml 复制代码
<Window x:Class="HardwareMonitor.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="硬件实时监控" Height="320" Width="400">
    <StackPanel Margin="20">
        <TextBlock Text="CPU 使用率" FontWeight="Bold"/>
        <ProgressBar x:Name="CpuBar" Height="20" Maximum="100"/>
        <TextBlock x:Name="CpuText"/>

        <TextBlock Text="内存使用" FontWeight="Bold" Margin="0,10,0,0"/>
        <ProgressBar x:Name="MemBar" Height="20" Maximum="100"/>
        <TextBlock x:Name="MemText"/>

        <TextBlock Text="硬盘使用" FontWeight="Bold" Margin="0,10,0,0"/>
        <ProgressBar x:Name="DiskBar" Height="20" Maximum="100"/>

        <TextBlock Text="CPU 温度" FontWeight="Bold" Margin="0,10,0,0"/>
        <TextBlock x:Name="TempText" FontSize="16" Foreground="Red"/>
    </StackPanel>
</Window>

3.2 MainWindow.xaml.cs

csharp 复制代码
using System.Windows;

namespace HardwareMonitor
{
    public partial class MainWindow : Window
    {
        private readonly HardwareMonitor _monitor;

        public MainWindow()
        {
            InitializeComponent();
            _monitor = new HardwareMonitor(1000);
            _monitor.OnDataUpdated += UpdateUI;
            _monitor.Start();
        }

        private void UpdateUI(HardwareData data)
        {
            Dispatcher.Invoke(() =>
            {
                CpuBar.Value = data.CpuUsage;
                CpuText.Text = $"{data.CpuUsage:F1}%";

                MemBar.Value = data.MemoryUsedMb / data.MemoryTotalMb * 100;
                MemText.Text = $"{data.MemoryUsedMb:F0} MB / {data.MemoryTotalMb:F0} MB";

                DiskBar.Value = data.DiskUsage;
                TempText.Text = $"{data.Temperature:F1} ℃";
            });
        }
    }
}

参考代码 C# 实时查看 硬件使用率(CPU/内存/硬盘等) www.youwenfan.com/contentcsu/62418.html

四、远程设备监控

4.1 通过 WMI 监控远程 Windows 设备

csharp 复制代码
public static float GetRemoteCpuUsage(string ip, string user, string pwd)
{
    var options = new ConnectionOptions
    {
        Username = user,
        Password = pwd,
        Impersonation = ImpersonationLevel.Impersonate
    };

    var scope = new ManagementScope($"\\\\{ip}\\root\\cimv2", options);
    scope.Connect();

    using var searcher = new ManagementObjectSearcher(
        scope, new ObjectQuery("SELECT LoadPercentage FROM Win32_Processor"));

    foreach (ManagementObject obj in searcher.Get())
        return Convert.ToSingle(obj["LoadPercentage"]);

    return 0;
}

五、Linux / ARM / 嵌入式(STM32 上位机)

csharp 复制代码
// Linux
cat /proc/cpuinfo
cat /proc/meminfo
df -h
csharp 复制代码
public static float GetLinuxCpuUsage()
{
    var cpu = File.ReadAllText("/proc/stat").Split('\n')[0];
    return ParseCpu(cpu);
}
相关推荐
kobesdu1 小时前
【ROS2实战笔记-18】ROS2 通信的隐秘控制:DDS 配置参数如何决定系统性能
网络·人工智能·笔记·机器人·开源·ros·人形机器人
不午休の野猫1 小时前
vs + qt环境编译.sln项目时报无法解析的外部符号metaObject && qt_metacast
开发语言·qt
吴声子夜歌2 小时前
Java——接口的细节
java·开发语言·算法
阿拉金alakin2 小时前
深入理解 Java 锁机制:CAS 原理、synchronized 优化与主流锁策略全总结
java·开发语言
myheartgo-on2 小时前
Java—方 法
java·开发语言·算法·青少年编程
雨落在了我的手上2 小时前
如何学习java?
java·开发语言·学习
wangl_922 小时前
Modbus RTU 与 Modbus TCP 深入指南-现代替代协议
网络·网络协议·tcp/ip·tcp·modbus·rtu
神仙别闹3 小时前
基于 C# OpenPGP 的文件管理系统
开发语言·c#
番石榴AI3 小时前
纯 CPU 推理!0.1B 超轻量级端到端OCR模型,使用 Java 进行文档解析
java·开发语言·ocr