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

关闭新窗口后调用DisplayAlert抛出Win32异常问题排查

Win32异常:关闭自定义窗口后调用DisplayAlert出错

问题描述

通过以下代码打开新窗口:

void method1(){
    wHandle = new Window(new MyPage());
    Application.Current.OpenWindow(wHandle);
}

调用另一个方法关闭窗口:

void method2(){
    Application.Current.CloseWindow(wHandle);
}

窗口关闭后调用DisplayAlert时触发Win32异常,已确认该窗口不在应用窗口池中,但问题仍未解决。

异常提示截图:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:02:48