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

网络变化时更新IP地址文本框的技术实现问题求助

问题解决:WPF应用网络变化时更新UI崩溃的修复

崩溃原因

NetworkChange的NetworkAddressChanged事件回调是在非UI线程触发的,而WPF的UI控件(如TxtBoxIPAddress)只能由创建它的UI线程访问和修改,直接在回调里操作UI会引发跨线程异常,导致应用崩溃。

修复后的代码

修改回调方法,通过Dispatcher将UI操作切换到UI线程执行:

public void AddressChangedCallback(object sender, EventArgs e)
{
    // 切换到UI线程执行UI操作
    Application.Current.Dispatcher.Invoke(() =>
    {
        using (PowerShell powerShell = PowerShell.Create())
        {
            try
            {
                var ps1 = @"(Get-NetIPAddress -AddressFamily IPv4 -AddressState Preferred -PrefixOrigin Dhcp).IPv4Address";

                powerShell.AddScript(ps1);
                Collection<PSObject> PSOutput = powerShell.Invoke();
                StringBuilder stringBuilder = new StringBuilder();
                foreach (PSObject pSObject in PSOutput)
                {
                    stringBuilder.AppendLine(pSObject.ToString());
                }

                TxtBoxIPAddress.Text = stringBuilder.ToString().Trim(); // 移除多余换行符
            }
            catch
            {
                TxtBoxIPAddress.Text = "No Address Found!";
            }
        }
    });
}

额外优化建议

  • 避免依赖PowerShell,改用.NET原生API获取IP,减少外部依赖且性能更稳定:

    private string GetCurrentIPv4Address()
    {
        foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces())
        {
            // 过滤掉未启用的网卡和回环网卡
            if (networkInterface.OperationalStatus != OperationalStatus.Up || 
                networkInterface.NetworkInterfaceType == NetworkInterfaceType.Loopback)
                continue;
    
            foreach (var unicastAddr in networkInterface.GetIPProperties().UnicastAddresses)
            {
                // 筛选DHCP分配的IPv4地址
                if (unicastAddr.Address.AddressFamily == AddressFamily.InterNetwork &&
                    unicastAddr.PrefixOrigin == PrefixOrigin.Dhcp)
                {
                    return unicastAddr.Address.ToString();
                }
            }
        }
        return null;
    }
    

    替换回调中的PowerShell逻辑,直接调用该方法即可完成IP获取与UI更新。

  • 删除临时方案中的重启程序逻辑,使用修复后的回调即可实现实时更新。

内容的提问来源于stack exchange,提问作者angelman26

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:10:14