网络变化时更新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
相关产品推荐
相关产品推荐

