308 lines
9.8 KiB
C#
308 lines
9.8 KiB
C#
/*
|
||
* <copyright>
|
||
Company="公司"
|
||
2020-2025
|
||
Author=JCH
|
||
Path=XiaoZhiSharp.Utils.SystemMonitor.cs
|
||
* <copyright>
|
||
* --------------------------------------------------------------
|
||
* 机器名称:JCH
|
||
* 文件名:SystemMonitor.cs
|
||
* 版本号:V1.0.0.0
|
||
* 创建人:JCH
|
||
* 创建时间:2025/9/27 9:33:01
|
||
* 描述:
|
||
* --------------------------------------------------------------
|
||
* 修改时间:2025/9/27 9:33:01
|
||
* 修改人:JCH
|
||
* 版本号:V1.0.0.0
|
||
* 描述:
|
||
* --------------------------------------------------------------
|
||
*/
|
||
|
||
using LibreHardwareMonitor.Hardware;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace XiaoZhiSharp.Utils
|
||
{
|
||
public class SystemMonitor : IDisposable
|
||
{
|
||
private Computer _computer;
|
||
private readonly Dictionary<SensorType, List<ISensor>> _sensors;
|
||
private bool _isMonitoring;
|
||
private Task _monitoringTask;
|
||
private CancellationTokenSource _cancellationTokenSource;
|
||
|
||
public SystemMonitor()
|
||
{
|
||
_sensors = new Dictionary<SensorType, List<ISensor>>();
|
||
InitializeComputer();
|
||
}
|
||
|
||
private void InitializeComputer()
|
||
{
|
||
_computer = new Computer
|
||
{
|
||
//IsCpuEnabled = true,
|
||
IsGpuEnabled = true,
|
||
//IsMemoryEnabled = true,
|
||
//IsMotherboardEnabled = true,
|
||
//IsControllerEnabled = true,
|
||
//IsNetworkEnabled = true,
|
||
//IsStorageEnabled = true
|
||
};
|
||
|
||
_computer.Open();
|
||
_computer.Accept(new UpdateVisitor());
|
||
}
|
||
|
||
public HardwareInfo GetHardwareInfo()
|
||
{
|
||
UpdateAllSensors();
|
||
|
||
return new HardwareInfo
|
||
{
|
||
//CpuUsage = GetCpuUsage(),
|
||
GpuUsage = GetGpuUsage(),
|
||
//MemoryUsage = GetMemoryUsage(),
|
||
//DiskUsage = GetDiskUsage(),
|
||
Timestamp = DateTime.Now
|
||
};
|
||
}
|
||
|
||
private void UpdateAllSensors()
|
||
{
|
||
foreach (var hardware in _computer.Hardware)
|
||
{
|
||
hardware.Update();
|
||
}
|
||
}
|
||
|
||
private float GetCpuUsage()
|
||
{
|
||
foreach (var hardware in _computer.Hardware)
|
||
{
|
||
if (hardware.HardwareType == HardwareType.Cpu)
|
||
{
|
||
var loadSensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Load && s.Name.Contains("CPU Total"));
|
||
|
||
if (loadSensor != null && loadSensor.Value.HasValue)
|
||
{
|
||
return loadSensor.Value.Value;
|
||
}
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
private float GetGpuUsage()
|
||
{
|
||
// 检查NVIDIA GPU
|
||
foreach (var hardware in _computer.Hardware)
|
||
{
|
||
if (hardware.HardwareType == HardwareType.GpuNvidia)
|
||
{
|
||
var loadSensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Load);
|
||
|
||
if (loadSensor != null && loadSensor.Value.HasValue)
|
||
{
|
||
return loadSensor.Value.Value;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 检查AMD GPU
|
||
foreach (var hardware in _computer.Hardware)
|
||
{
|
||
if (hardware.HardwareType == HardwareType.GpuAmd)
|
||
{
|
||
var loadSensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Load);
|
||
|
||
if (loadSensor != null && loadSensor.Value.HasValue)
|
||
{
|
||
return loadSensor.Value.Value;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 检查Intel集成显卡
|
||
foreach (var hardware in _computer.Hardware)
|
||
{
|
||
if (hardware.HardwareType == HardwareType.GpuIntel)
|
||
{
|
||
var loadSensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Load);
|
||
|
||
if (loadSensor != null && loadSensor.Value.HasValue)
|
||
{
|
||
return loadSensor.Value.Value;
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
private MemoryInfo GetMemoryUsage()
|
||
{
|
||
foreach (var hardware in _computer.Hardware)
|
||
{
|
||
if (hardware.HardwareType == HardwareType.Memory)
|
||
{
|
||
var memoryInfo = new MemoryInfo();
|
||
|
||
// 获取已使用内存
|
||
var usedMemorySensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Data && s.Name.Contains("Used"));
|
||
|
||
// 获取可用内存
|
||
var availableMemorySensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Data && s.Name.Contains("Available"));
|
||
|
||
if (usedMemorySensor != null && usedMemorySensor.Value.HasValue)
|
||
{
|
||
memoryInfo.UsedGB = usedMemorySensor.Value.Value / 1024; // 转换为GB
|
||
}
|
||
|
||
if (availableMemorySensor != null && availableMemorySensor.Value.HasValue)
|
||
{
|
||
memoryInfo.AvailableGB = availableMemorySensor.Value.Value / 1024;
|
||
}
|
||
|
||
memoryInfo.UsagePercentage = memoryInfo.TotalGB > 0 ?
|
||
(memoryInfo.UsedGB / memoryInfo.TotalGB) * 100 : 0;
|
||
|
||
return memoryInfo;
|
||
}
|
||
}
|
||
return new MemoryInfo();
|
||
}
|
||
|
||
private DiskInfo GetDiskUsage()
|
||
{
|
||
var diskInfo = new DiskInfo();
|
||
|
||
foreach (var hardware in _computer.Hardware)
|
||
{
|
||
if (hardware.HardwareType == HardwareType.Storage)
|
||
{
|
||
// 获取磁盘负载
|
||
var loadSensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Load);
|
||
|
||
if (loadSensor != null && loadSensor.Value.HasValue)
|
||
{
|
||
diskInfo.LoadPercentage = loadSensor.Value.Value;
|
||
}
|
||
|
||
// 获取磁盘读写速度
|
||
var readRateSensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Throughput && s.Name.Contains("Read"));
|
||
|
||
var writeRateSensor = hardware.Sensors
|
||
.FirstOrDefault(s => s.SensorType == SensorType.Throughput && s.Name.Contains("Write"));
|
||
|
||
if (readRateSensor != null && readRateSensor.Value.HasValue)
|
||
{
|
||
diskInfo.ReadRateMBs = readRateSensor.Value.Value / 1024 / 1024;
|
||
}
|
||
|
||
if (writeRateSensor != null && writeRateSensor.Value.HasValue)
|
||
{
|
||
diskInfo.WriteRateMBs = writeRateSensor.Value.Value / 1024 / 1024;
|
||
}
|
||
|
||
break; // 只获取第一个存储设备的信息
|
||
}
|
||
}
|
||
return diskInfo;
|
||
}
|
||
|
||
public void StartContinuousMonitoring(Action<HardwareInfo> updateCallback, int intervalMs = 1000)
|
||
{
|
||
if (_isMonitoring) return;
|
||
|
||
_isMonitoring = true;
|
||
_cancellationTokenSource = new CancellationTokenSource();
|
||
|
||
_monitoringTask = Task.Run(async () =>
|
||
{
|
||
while (_isMonitoring && !_cancellationTokenSource.Token.IsCancellationRequested)
|
||
{
|
||
var info = GetHardwareInfo();
|
||
updateCallback?.Invoke(info);
|
||
|
||
await Task.Delay(intervalMs, _cancellationTokenSource.Token);
|
||
}
|
||
});
|
||
}
|
||
|
||
public void StopContinuousMonitoring()
|
||
{
|
||
_isMonitoring = false;
|
||
_cancellationTokenSource?.Cancel();
|
||
_monitoringTask?.Wait(1000);
|
||
}
|
||
|
||
public void Dispose()
|
||
{
|
||
StopContinuousMonitoring();
|
||
_computer?.Close();
|
||
}
|
||
}
|
||
|
||
// 更新访问器类
|
||
public class UpdateVisitor : IVisitor
|
||
{
|
||
public void VisitComputer(IComputer computer)
|
||
{
|
||
computer.Traverse(this);
|
||
}
|
||
|
||
public void VisitHardware(IHardware hardware)
|
||
{
|
||
hardware.Update();
|
||
foreach (var subHardware in hardware.SubHardware)
|
||
{
|
||
subHardware.Accept(this);
|
||
}
|
||
}
|
||
|
||
public void VisitSensor(ISensor sensor) { }
|
||
|
||
public void VisitParameter(IParameter parameter) { }
|
||
}
|
||
|
||
// 数据模型类
|
||
public class HardwareInfo
|
||
{
|
||
public float CpuUsage { get; set; } // CPU使用率百分比
|
||
public float GpuUsage { get; set; } // GPU使用率百分比
|
||
public MemoryInfo MemoryUsage { get; set; } // 内存使用信息
|
||
public DiskInfo DiskUsage { get; set; } // 磁盘使用信息
|
||
public DateTime Timestamp { get; set; }
|
||
}
|
||
|
||
public class MemoryInfo
|
||
{
|
||
public float UsedGB { get; set; }
|
||
public float AvailableGB { get; set; }
|
||
public float TotalGB => UsedGB + AvailableGB;
|
||
public float UsagePercentage { get; set; }
|
||
}
|
||
|
||
public class DiskInfo
|
||
{
|
||
public float LoadPercentage { get; set; } // 磁盘负载百分比
|
||
public float ReadRateMBs { get; set; } // 读取速度 MB/s
|
||
public float WriteRateMBs { get; set; } // 写入速度 MB/s
|
||
}
|
||
}
|