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);
}
相关推荐
lv__pf6 分钟前
09-深入理解AQS之独占锁ReentrantLock源码分析【TL 并发 09】
java·开发语言
Lynne3099 分钟前
为什么工业数据越来越需要在现场处理?边缘计算正在解决什么问题?
网络·数据分析·数据
...62214 分钟前
WinForm中Socket通信服务端客户端代码实现讲解
tcp/ip·c#·socket
这是程序猿26 分钟前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
m0_7345717637 分钟前
深入理解5g <十二> pucch
网络·5g
quantdash_cc38 分钟前
从数据采集到策略消费,股票日内行情管道应该怎么设计?
开发语言·python·数据分析·量化交易·股票数据·quantdash
郝学胜-神的一滴1 小时前
C++20模板元编程 01:从零吃透模板核心底层逻辑
开发语言·c++·vscode·程序人生·开源
闲云野鹤在人间1 小时前
Docker入门|第3章 镜像详解
linux·网络·docker·容器·centos·云计算·php
可乐鸡翅yeah_1 小时前
HLS流媒体首屏起播慢深度优化,从分片、索引、播放器全链路调优
开发语言·javascript·ecmascript·m3u8·m3u8在线
luj_17681 小时前
生物体如何应对功能击穿?
c语言·开发语言·c++·经验分享·算法