一、整体架构
┌─────────────────────────────────────────────────────────────┐ │ 硬件资源监控系统 │ ├─────────────────────────────────────────────────────────────┤ │ 数据采集层 │ 业务逻辑层 │ 展示层 │ 告警层 │ │ │ │ │ │ │ • PerformanceCounter │ • 数据缓存 │ • WinForms │ │ • WMI (ManagementObject) │ • 定时采样 │ • WPF │ │ • System.Diagnostics │ • 历史记录 │ • 上位机 │ │ • SNMP / SSH (远程) │ • 阈值判断 │ • Web API │ └─────────────────────────────────────────────────────────────┘二、方案一:本机实时监控
适合:上位机、工业PC、边缘网关
2.1 核心类(HardwareMonitor.cs)
usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Management;usingSystem.Threading;namespaceHardwareMonitor{publicclassHardwareMonitor{privatereadonlyTimer_timer;privatereadonlyint_intervalMs;publicdelegatevoidHardwareDataHandler(HardwareDatadata);publiceventHardwareDataHandlerOnDataUpdated;publicHardwareMonitor(intintervalMs=1000){_intervalMs=intervalMs;_timer=newTimer(Collect,null,Timeout.Infinite,Timeout.Infinite);}publicvoidStart()=>_timer.Change(0,_intervalMs);publicvoidStop()=>_timer.Change(Timeout.Infinite,Timeout.Infinite);privatevoidCollect(objectstate){vardata=newHardwareData{CpuUsage=GetCpuUsage(),MemoryUsedMb=GetMemoryUsed(),MemoryTotalMb=GetMemoryTotal(),DiskUsage=GetDiskUsage(),NetworkSentKBps=GetNetworkSent(),NetworkReceivedKBps=GetNetworkReceived(),Temperature=GetCpuTemperature()};OnDataUpdated?.Invoke(data);}#regionCPUprivatefloatGetCpuUsage(){usingvarcpu=newPerformanceCounter("Processor","% Processor Time","_Total");cpu.NextValue();Thread.Sleep(100);returncpu.NextValue();}#endregion#regionMemoryprivatefloatGetMemoryUsed(){usingvarmem=newPerformanceCounter("Memory","Committed Bytes");returnmem.NextValue()/1024/1024;}privatefloatGetMemoryTotal(){usingvarmem=newPerformanceCounter("Memory","Commit Limit");returnmem.NextValue()/1024/1024;}#endregion#regionDiskprivatefloatGetDiskUsage(){usingvardisk=newPerformanceCounter("PhysicalDisk","% Disk Time","_Total");disk.NextValue();Thread.Sleep(100);returndisk.NextValue();}#endregion#regionNetworkprivatefloatGetNetworkSent(){usingvarnet=newPerformanceCounter("Network Interface","Bytes Sent/sec",GetNetworkCard());returnnet.NextValue()/1024;}privatefloatGetNetworkReceived(){usingvarnet=newPerformanceCounter("Network Interface","Bytes Received/sec",GetNetworkCard());returnnet.NextValue()/1024;}privatestringGetNetworkCard(){usingvarsearcher=newManagementObjectSearcher("SELECT Name FROM Win32_NetworkAdapter WHERE NetEnabled = true");foreach(ManagementObjectobjinsearcher.Get())returnobj["Name"].ToString();return"";}#endregion#regionTemperature(WMI)privatefloatGetCpuTemperature(){try{usingvarsearcher=newManagementObjectSearcher(@"root\WMI","SELECT CurrentTemperature FROM MSAcpi_ThermalZoneTemperature");foreach(ManagementObjectobjinsearcher.Get()){vartemp=Convert.ToDouble(obj["CurrentTemperature"].ToString());return(float)(temp/10.0-273.15);// Kelvin → Celsius}}catch{}return0;}#endregion}publicclassHardwareData{publicfloatCpuUsage{get;set;}publicfloatMemoryUsedMb{get;set;}publicfloatMemoryTotalMb{get;set;}publicfloatDiskUsage{get;set;}publicfloatNetworkSentKBps{get;set;}publicfloatNetworkReceivedKBps{get;set;}publicfloatTemperature{get;set;}publicoverridestringToString(){return$"CPU:{CpuUsage:F1}% MEM:{MemoryUsedMb:F0}/{MemoryTotalMb:F0}MB DISK:{DiskUsage:F1}% TEMP:{Temperature:F1}℃";}}}三、WPF 实时显示
3.1 MainWindow.xaml
<Windowx:Class="HardwareMonitor.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"Title="硬件实时监控"Height="320"Width="400"><StackPanelMargin="20"><TextBlockText="CPU 使用率"FontWeight="Bold"/><ProgressBarx:Name="CpuBar"Height="20"Maximum="100"/><TextBlockx:Name="CpuText"/><TextBlockText="内存使用"FontWeight="Bold"Margin="0,10,0,0"/><ProgressBarx:Name="MemBar"Height="20"Maximum="100"/><TextBlockx:Name="MemText"/><TextBlockText="硬盘使用"FontWeight="Bold"Margin="0,10,0,0"/><ProgressBarx:Name="DiskBar"Height="20"Maximum="100"/><TextBlockText="CPU 温度"FontWeight="Bold"Margin="0,10,0,0"/><TextBlockx:Name="TempText"FontSize="16"Foreground="Red"/></StackPanel></Window>3.2 MainWindow.xaml.cs
usingSystem.Windows;namespaceHardwareMonitor{publicpartialclassMainWindow:Window{privatereadonlyHardwareMonitor_monitor;publicMainWindow(){InitializeComponent();_monitor=newHardwareMonitor(1000);_monitor.OnDataUpdated+=UpdateUI;_monitor.Start();}privatevoidUpdateUI(HardwareDatadata){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 设备
publicstaticfloatGetRemoteCpuUsage(stringip,stringuser,stringpwd){varoptions=newConnectionOptions{Username=user,Password=pwd,Impersonation=ImpersonationLevel.Impersonate};varscope=newManagementScope($"\\\\{ip}\\root\\cimv2",options);scope.Connect();usingvarsearcher=newManagementObjectSearcher(scope,newObjectQuery("SELECT LoadPercentage FROM Win32_Processor"));foreach(ManagementObjectobjinsearcher.Get())returnConvert.ToSingle(obj["LoadPercentage"]);return0;}五、Linux / ARM / 嵌入式(STM32 上位机)
// Linuxcat/proc/cpuinfo cat/proc/meminfo df-hpublicstaticfloatGetLinuxCpuUsage(){varcpu=File.ReadAllText("/proc/stat").Split('\n')[0];returnParseCpu(cpu);}