当前位置: 首页 > news >正文

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

一、整体架构

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

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

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

2.1 核心类(HardwareMonitor.cs)

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 CPUprivate float GetCpuUsage(){using var cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");cpu.NextValue();Thread.Sleep(100);return cpu.NextValue();}#endregion#region Memoryprivate 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 Diskprivate float GetDiskUsage(){using var disk = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");disk.NextValue();Thread.Sleep(100);return disk.NextValue();}#endregion#region Networkprivate 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

<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

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/contentcnu/62418.html

四、远程设备监控

4.1 通过 WMI 监控远程 Windows 设备

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 上位机)

// Linux
cat /proc/cpuinfo
cat /proc/meminfo
df -h
public static float GetLinuxCpuUsage()
{var cpu = File.ReadAllText("/proc/stat").Split('\n')[0];return ParseCpu(cpu);
}
http://www.jsqmd.com/news/816470/

相关文章:

  • 网站推广软文平台:2026新媒体营销平台权威测评 - 博客湾
  • 三步永久保存微信聊天记录:无需越狱的完整导出方案
  • 保姆级教程:在OptiSystem中搭建7通道WDM系统(含EDFA放大与色散补偿配置)
  • 中介房源管理系统使用体验评测
  • Java还是大模型?小白程序员必看:收藏这份方向选择指南,抓住未来红利!
  • 上海凤金实业:松江电梯拆除找哪家 - LYL仔仔
  • socket相关的部分常用函数总结
  • [K8S小白问题集] - APIServer接受到的API调用都是什么样的?与http请求的API差别很大吗?
  • 2026年嘉兴黄金回收哪家强?靠谱机构推荐 - 生活测评君
  • 长期项目使用中观察到的Taotoken账单明细与成本分析报告
  • 保姆级教程:零基础用BeagleBone Black搭建你的第一个物联网网关(含Node-RED配置)
  • STM32CubeMX与IDE拆分:性能、灵活性与现代开发流程的革新
  • 拆解SMT产线‘火眼金睛’:AOI与X-Ray检测机,如何帮我们揪出BGA虚焊和QFN不良?
  • 【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析
  • 国内闭式冷却塔主流企业排行 核心维度实测对比 - 奔跑123
  • 免费机票价格监控系统:用FlightSpy智能追踪航班优惠,轻松抢到最低价机票
  • 为Claude Code配置Taotoken后端解决封号与Token不足难题
  • 2026年高精度水处理超声波流量传感器品牌推荐 - 品牌2025
  • STM32F103C8T6调试神器:匿名上位机V7串口波形显示保姆级配置流程
  • 2026年俄罗斯莫斯科水处理展 ECWATECH - 中国组团单位- 新天国际会展 - 新天国际会展
  • Web Scraper装好了然后呢?给新手的第一个实战项目:5分钟爬取豆瓣电影Top250
  • HoRain云--Lua调试全攻略
  • 达梦数据库适配测试 你想了解全流程要点吗
  • 为 OpenClaw 智能体工作流配置统一的大模型调用网关
  • 量化基石:深入解析法玛-弗伦奇模型中的SMB与HML因子
  • 在macOS上无缝运行Windows应用的终极方案:Whisky深度体验指南
  • 对比直接使用厂商API与通过Taotoken调用的账单清晰度
  • 贵州维恒琦科技客服AI流量赋能, 打造数字平台赋能智能新技术! - 资讯速览
  • 2026年内墙仿石漆供应厂家选择指南:专业维度解析与优质厂商推荐 - 产业观察网
  • 武汉市精诚洁环保:武汉水箱清洗消毒公司 - LYL仔仔