From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点

---
 WPFProject/ResourceListener.cs |  133 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 133 insertions(+), 0 deletions(-)

diff --git a/WPFProject/ResourceListener.cs b/WPFProject/ResourceListener.cs
new file mode 100644
index 0000000..3759620
--- /dev/null
+++ b/WPFProject/ResourceListener.cs
@@ -0,0 +1,133 @@
+锘縰sing log4net;
+using System;
+using System.Diagnostics;
+using System.Management;
+using System.Timers;
+
+namespace WPFProject
+{
+    public class RunTimeState
+    {
+        public float cpuRate { get; set; }
+        public double remRate { get; set; }
+
+        public float totalCpuRate { get; set; }
+        public double totalRemRate { get; set; }
+    }
+
+    public class ResourceListener
+    {
+        public event EventHandler<RunTimeState> RefreshEvent;
+        private Timer timer;
+        private System.Threading.CancellationTokenSource _can;
+
+        private static ResourceListener instance;
+        public static ResourceListener Instance
+        {
+            get
+            {
+
+                if (instance == null)
+                {
+                    instance = new ResourceListener();
+                }
+                return instance;
+            }
+        }
+        private ILog log = LogManager.GetLogger("ResourceListener");
+
+        // CPU鍗犵敤
+        private PerformanceCounter totalCpuCounter;
+
+        private PerformanceCounter cpuCounter;
+
+        private ResourceListener()
+        {
+            totalCpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
+            cpuCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName, true);
+        }
+
+        public void Start()
+        {
+            _can = new System.Threading.CancellationTokenSource();
+            Refresh();
+            timer = new Timer();
+            timer.AutoReset = false;
+            timer.Interval = 30000;
+            timer.Elapsed += Timer_Elapsed;
+            timer.Enabled = true;
+        }
+
+        private void Refresh()
+        {
+            try
+            {
+                var _cpuCount = Environment.ProcessorCount;
+                ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
+                ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
+
+                string prcName = Process.GetCurrentProcess().ProcessName;
+                var counter_Exec = new PerformanceCounter("Process", "Working Set - Private", prcName);
+                ulong dWsp_Exec = (ulong)(counter_Exec.RawValue / 1024);
+
+                var totalCpuRate = totalCpuCounter.NextValue();
+                var cpuRate = cpuCounter.NextValue() / _cpuCount;
+
+                foreach (ManagementObject obj in searcher.Get())
+                {
+                    ulong totalVisibleMemorySize = (ulong)obj["TotalVisibleMemorySize"];
+                    ulong freePhysicalMemory = (ulong)obj["FreePhysicalMemory"];
+
+                    ulong usedMemory = totalVisibleMemorySize - freePhysicalMemory;
+                    string info = $"\r\n鎬诲唴瀛�: {totalVisibleMemorySize / 1024} MB\r\n";
+
+                    info += $"宸蹭娇鐢ㄥ唴瀛�: {usedMemory / 1024} MB\r\n";
+                    double usagePercent = usedMemory * 100d / totalVisibleMemorySize;
+                    info += $"鍐呭瓨鍗犵敤鐜�: {usagePercent:F2}%\r\n";
+
+                    info += $"搴旂敤鍗犵敤鍐呭瓨: {dWsp_Exec / 1024} MB\r\n";
+                    double appPercent = dWsp_Exec * 100d / totalVisibleMemorySize;
+                    info += $"搴旂敤鍐呭瓨鍗犵敤鐜�: {appPercent:F2}%";
+                    RefreshEvent?.Invoke(this, new RunTimeState
+                    {
+                        cpuRate = cpuRate,
+                        remRate = appPercent,
+                        totalCpuRate = totalCpuRate,
+                        totalRemRate = usagePercent
+                    });
+                    if (usagePercent > 80)
+                    {
+                        log.Info(info);
+                        //AlarmUtil.CreateAlarm("App", "鍐呭瓨鍗犵敤杩囬珮锛岃秴80%", out _);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Refresh Resource Error.", ex);
+            }
+        }
+
+        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
+        {
+            try
+            {
+                timer.Enabled = false;
+                _can.Token.ThrowIfCancellationRequested();
+                Refresh();
+                timer.Enabled = true;
+            }
+            catch
+            {
+
+            }
+        }
+
+        public void Stop()
+        {
+            _can?.Cancel();
+            _can?.Dispose();
+            instance = null;
+        }
+    }
+}

--
Gitblit v1.9.1