Surface Pro上WinForm应用WiFi断连/重连告警功能实现求助
问题解决:Surface Pro WinForm应用WiFi断连无提示且冻结
原代码的核心问题
- 事件未注册:仅定义了回调方法,但未绑定到
NetworkChange.NetworkAddressChanged事件,导致WiFi状态变化时无法触发回调。 - 跨线程UI操作:
NetworkChange事件回调运行在非UI线程,直接调用弹窗会阻塞UI线程,引发应用冻结甚至跨线程异常。 - WiFi适配器判断不可靠:依赖名称包含"WiFi"的判断逻辑,Surface Pro的WiFi适配器在中文系统下可能显示为"无线网络连接",英文系统可能是"WLAN",会遗漏目标适配器。
- 无状态防抖:地址变化事件可能重复触发,导致相同提示反复弹出,影响体验。
修复后的完整代码
// 全局变量跟踪WiFi状态,避免重复弹窗 private static OperationalStatus _lastWiFiStatus = OperationalStatus.Unknown; public MainForm() { InitializeComponent(); // 注册网络地址变化事件(原代码缺失的关键步骤) NetworkChange.NetworkAddressChanged += AddressChangedCallback; } static void AddressChangedCallback(object sender, EventArgs e) { // 通过网络类型精准识别WiFi适配器,不受名称影响 var wifiAdapter = NetworkInterface.GetAllNetworkInterfaces() .FirstOrDefault(n => n.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && n.OperationalStatus != OperationalStatus.NotPresent); if (wifiAdapter == null) return; // 状态未变化则直接返回,避免重复弹窗 if (wifiAdapter.OperationalStatus == _lastWiFiStatus) return; _lastWiFiStatus = wifiAdapter.OperationalStatus; // 切换到UI线程执行弹窗,解决冻结问题 Application.OpenForms[0].Invoke(new Action(() => { if (wifiAdapter.OperationalStatus == OperationalStatus.Down) { FriendlyMessageBox.Show("抱歉 - 网络连接已断开" + Environment.NewLine + Environment.NewLine + "关闭EIS会导致未保存的工作丢失" , MessageBoxButtons.OK , FriendlyMessageBox.FriendlyMessageBoxStyle.Warning , "系统离线"); } else if (wifiAdapter.OperationalStatus == OperationalStatus.Up) { FriendlyMessageBox.Show("网络连接已恢复" + Environment.NewLine + Environment.NewLine + "可以继续你的工作了" , MessageBoxButtons.OK , FriendlyMessageBox.FriendlyMessageBoxStyle.Success , "系统已连接"); } })); } // 窗体关闭时取消事件注册,防止内存泄漏 protected override void OnFormClosed(FormClosedEventArgs e) { NetworkChange.NetworkAddressChanged -= AddressChangedCallback; base.OnFormClosed(e); }
关键修复点说明
- 事件绑定:在窗体构造函数中完成事件注册,确保回调能被正常触发。
- 跨线程处理:通过
Control.Invoke将UI操作切换到主线程,彻底解决应用冻结问题。 - 精准识别WiFi:使用
NetworkInterfaceType.Wireless80211判断WiFi适配器,不受系统语言和自定义名称影响。 - 状态防抖:记录上一次WiFi状态,仅在状态变化时弹窗,避免重复提示。
- 内存泄漏预防:窗体关闭时取消事件注册,清除无用的回调引用。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

