WPF 监控CPU、内存性能

发布于:2025-08-18 ⋅ 阅读:(18) ⋅ 点赞:(0)

本段代码是一个封装的用户控件
在这里插入图片描述

<UserControl x:Class="YF_Frame.PerformanceMonitor"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" >
    <lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Right" Background="{DynamicResource BackgroundBrush}" Foreground="{DynamicResource TextBrush}">
        <lvc:CartesianChart.AxisY>
            <lvc:Axis Title="使用率 (%)" LabelFormatter="{Binding YFormatter}" 
                      MinValue="0" MaxValue="100" Foreground="{DynamicResource TextBrush}"></lvc:Axis>
        </lvc:CartesianChart.AxisY>
        <lvc:CartesianChart.AxisX>
            <lvc:Axis Title="时间" Labels="{Binding Labels}" Foreground="{DynamicResource TextBrush}"></lvc:Axis>
        </lvc:CartesianChart.AxisX>
    </lvc:CartesianChart>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using LiveCharts.Defaults;
using LiveCharts.Wpf;
using LiveCharts;
using System.Management;
using System.Diagnostics;
using System.Windows.Threading;
using System.ComponentModel;


namespace YF_Frame
{
    /// <summary>
    /// PerformanceMonitor.xaml 的交互逻辑
    /// </summary>
    public partial class PerformanceMonitor : UserControl, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public SeriesCollection SeriesCollection { get; set; }
        public string[] Labels { get; set; }
        public Func<double, string> YFormatter { get; set; }


        private PerformanceCounter cpuCounter;
        private PerformanceCounter ramCounter;



        public PerformanceMonitor()
        {
            InitializeComponent();
            SeriesCollection = new SeriesCollection
            {
                
                new LineSeries
                {
                    Title = "CPU",
                    Values = new ChartValues<ObservableValue>
                    {
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0)
                    },
                    PointGeometry = DefaultGeometries.Circle,
                    PointGeometrySize = 10
                },
                new LineSeries
                {
                    Title = "内存",
                    Values = new ChartValues<ObservableValue>
                    {
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0),
                        new ObservableValue(0)
                    },
                    PointGeometry = DefaultGeometries.Square,
                    PointGeometrySize = 10
                }
            }; 

            Labels = new[] { "1分钟前", "50秒前", "40秒前", "30秒前", "20秒前", "现在" };
            YFormatter = value => value.ToString("N0");

            DataContext = this;

            // 初始化CPU计数器(全局CPU使用率)
            cpuCounter = new PerformanceCounter(
                "Processor",         // 类别(处理器)
                "% Processor Time",  // 计数器名称(CPU时间百分比)
                "_Total"             // 实例名称(_Total表示所有核心)
            );

            // 初始化内存计数器(可用内存百分比)
            ramCounter = new PerformanceCounter(
                "Memory",           // 类别(内存)
                "Available MBytes"   // 计数器名称(可用内存MB)
            );

            // 启动定时器刷新数据(每1秒更新一次)
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(5);
            timer.Tick += UpdatePerformanceData;
            timer.Start();
        }

        private void UpdatePerformanceData(object sender, EventArgs e)
        {
            
            try
            {
                // 获取CPU使用率(取当前值)
                float cpuUsage = cpuCounter.NextValue();

                // 获取可用内存(MB)
                float availableMemoryMB = ramCounter.NextValue();

                // 计算已用内存(假设总内存16GB,你可以替换为实际值)
                float totalMemoryMB = 16 * 1024; // 16GB = 16 * 1024 MB
                float usedMemoryMB = totalMemoryMB - availableMemoryMB;
                float memoryUsagePercent = (usedMemoryMB / totalMemoryMB) * 100;

                // 更新图表数据
                UpdateChartData(cpuUsage, memoryUsagePercent);

                // 更新标签(可选:显示最新数据)
                Labels = new[] { "25秒前", "20秒前", "15秒前", "10秒前", "5秒前", "现在" };
                OnPropertyChanged(nameof(Labels)); // 通知UI更新
            }
            catch (Exception ex)
            {
                // 由于 Windows 性能计数器损坏 => cmd lodctr / R
            }
        }

        private void UpdateChartData(float cpuUsage, float memoryUsage)
        {
            // 获取当前CPU和内存的数据序列
            var cpuSeries = SeriesCollection[0].Values as ChartValues<ObservableValue>;
            var memorySeries = SeriesCollection[1].Values as ChartValues<ObservableValue>;

            // 移除最旧的数据点(保持6个数据点)
            if (cpuSeries.Count >= 6)
            {
                cpuSeries.RemoveAt(0);
                memorySeries.RemoveAt(0);
            }

            // 添加新的数据点
            cpuSeries.Add(new ObservableValue(cpuUsage));
            memorySeries.Add(new ObservableValue(memoryUsage));
        }

    }
}


网站公告

今日签到

点亮在社区的每一天
去签到