关闭新窗口后调用DisplayAlert抛出Win32异常问题排查
Win32异常:关闭自定义窗口后调用DisplayAlert出错
问题描述
通过以下代码打开新窗口:
void method1(){ wHandle = new Window(new MyPage()); Application.Current.OpenWindow(wHandle); }
调用另一个方法关闭窗口:
void method2(){ Application.Current.CloseWindow(wHandle); }
窗口关闭后调用DisplayAlert时触发Win32异常,已确认该窗口不在应用窗口池中,但问题仍未解决。
异常提示截图:
按照提示打开新VS实例时程序无限冻结,已启用混合调试(截图显示调试设置中“启用混合调试”已勾选),但警告依旧弹出:
排查与解决思路
1. 清理无效窗口引用
关闭窗口后,wHandle可能仍持有已释放窗口的无效引用,导致后续UI操作访问无效资源:
- 修复代码:关闭窗口后立即将句柄置空
void method2(){ Application.Current.CloseWindow(wHandle); wHandle = null; // 释放无效引用 }
2. 确保DisplayAlert在有效UI线程执行
DisplayAlert依赖UI线程上下文,窗口关闭后若UI线程状态异常,可能触发底层Win32错误:
- 强制在UI线程调用:
Application.Current.Dispatcher.InvokeAsync(async () => { await DisplayAlert("提示", "消息内容", "确认"); });
3. 清理页面未完成的异步任务
如果MyPage中存在未完成的异步操作,窗口关闭后这些任务可能继续访问已释放资源:
- 在页面卸载时取消异步任务:
private CancellationTokenSource _cts; public MyPage() { InitializeComponent(); Unloaded += MyPage_Unloaded; _cts = new CancellationTokenSource(); } private void MyPage_Unloaded(object sender, RoutedEventArgs e) { _cts.Cancel(); _cts.Dispose(); }
4. 重置VS调试环境
新VS实例冻结可能是调试缓存或残留进程导致:
- 关闭所有VS实例,删除项目的
bin、obj目录,重新生成解决方案 - 重启电脑,清理系统临时文件后再尝试调试
内容的提问来源于stack exchange,提问作者Levyi
相关产品推荐
相关产品推荐

