using log4net; using SparkClient.Views.Dialog; namespace SparkClient.Model.Helper; using System.Management; public class NetworkSpeedHelper { private static readonly ILog Logger = LogManager.GetLogger(typeof(NetworkSpeedHelper)); private static int _cycle = 300000; private static bool _ignore = false; public static bool Ignore { get => _ignore; set { if (_ignore) { DisposeTimer(); } } } private static Timer _monitorTimer; private static object _lock = new object(); public static void StartMonitoring() { Logger.Info($"周期网络检测开始,周期: {_cycle}"); lock (_lock) { if (_monitorTimer == null) { _monitorTimer = new Timer(CheckSpeedCallback, null, _cycle, Timeout.Infinite); } } } private static void CheckSpeedCallback(object state) { try { // 检查停止标志 if (Ignore) { DisposeTimer(); return; } // 执行网络测速 var speed = InternetSpeedDetection(); // 触发阈值报警 if (speed < 866) { ShowSpeedAlert(speed); } // 重置定时器(单次触发模式) lock (_lock) { if (!Ignore && _monitorTimer != null) { _monitorTimer.Change(_cycle, Timeout.Infinite); } } } catch (Exception ex) { Logger.Info($"监控异常: {ex.Message}"); } } private static void DisposeTimer() { lock (_lock) { Logger.Info("网络检测取消!"); _monitorTimer?.Dispose(); _monitorTimer = null; } } private static void ShowSpeedAlert(double speed) { var result = MessageBoxHasCheck.ShowMessageDialog() ; NetworkSpeedHelper.Ignore = result; } private static double InternetSpeedDetection() { try { // 连接到WMI命名空间 var searcher = new ManagementObjectSearcher( "SELECT Name, Speed FROM Win32_NetworkAdapter " + "WHERE NetConnectionStatus = 2"); foreach (ManagementObject obj in searcher.Get()) { string name = obj["Name"].ToString(); if (obj["Speed"] != null) { long speedBps = Convert.ToInt64(obj["Speed"]); double speedMbps = speedBps / 1_000_000.0; return speedMbps; } } return 0; } catch (Exception ex) { return 0; } } }