You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Surface Pro上WinForm应用WiFi断连/重连告警功能实现求助

问题解决:Surface Pro WinForm应用WiFi断连无提示且冻结

原代码的核心问题

  1. 事件未注册:仅定义了回调方法,但未绑定到NetworkChange.NetworkAddressChanged事件,导致WiFi状态变化时无法触发回调。
  2. 跨线程UI操作:NetworkChange事件回调运行在非UI线程,直接调用弹窗会阻塞UI线程,引发应用冻结甚至跨线程异常。
  3. WiFi适配器判断不可靠:依赖名称包含"WiFi"的判断逻辑,Surface Pro的WiFi适配器在中文系统下可能显示为"无线网络连接",英文系统可能是"WLAN",会遗漏目标适配器。
  4. 无状态防抖:地址变化事件可能重复触发,导致相同提示反复弹出,影响体验。

修复后的完整代码

// 全局变量跟踪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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:05:28