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

WPF/Winforms中AppCenter的Crashes.ShouldAwaitUserConfirmation回调无弹窗问题

问题原因

你的问题核心出在回调执行线程不匹配:

  • AppCenter的ShouldAwaitUserConfirmation回调默认在后台非UI线程触发
  • WinForms/WPF的所有UI控件创建、显示操作必须在UI线程执行,后台线程调用ShowDialog时抛出的跨线程访问异常会被AppCenter SDK内部吞掉,所以你看不到任何报错,回调逻辑直接被跳过,崩溃日志按默认逻辑自动上报
修复方案

你需要把弹窗逻辑封送到UI线程执行,以下是适配后的实现代码:

WinForms 版本

// 提前在UI线程捕获同步上下文,建议在Program.Main方法、Application.Run执行前存储
var uiSynchronizationContext = SynchronizationContext.Current;

Crashes.ShouldAwaitUserConfirmation = () =>
{
    // 把弹窗逻辑Post到UI线程执行
    uiSynchronizationContext.Post(_ =>
    {
        var buttonSend = new Ookii.Dialogs.WinForms.TaskDialogButton("发送");
        var buttonAlwaysSend = new Ookii.Dialogs.WinForms.TaskDialogButton("始终发送");
        var buttonDontSend = new Ookii.Dialogs.WinForms.TaskDialogButton("不发送");

        var taskDialog = new Ookii.Dialogs.WinForms.TaskDialog();
        taskDialog.Buttons.Add(buttonSend);
        taskDialog.Buttons.Add(buttonAlwaysSend);
        taskDialog.Buttons.Add(buttonDontSend);

        taskDialog.WindowTitle = "程序出错";
        taskDialog.MainInstruction = "是否将错误报告发送给开发者?";

        var result = taskDialog.ShowDialog();

        if (result == buttonSend)
        {
            Crashes.NotifyUserConfirmation(UserConfirmation.Send);
        }
        else if (result == buttonAlwaysSend)
        {
            Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);
        }
        else
        {
            Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
        }
    }, null);
    
    return true;
};

AppCenter.Start("<SECRET>", typeof(Crashes));

WPF 版本

如果是WPF项目,使用Dispatcher调度UI逻辑即可:

Crashes.ShouldAwaitUserConfirmation = () =>
{
    // 用应用程序主调度器封送UI操作
    Application.Current.Dispatcher.Invoke(() =>
    {
        // 这里替换为WPF版本的弹窗逻辑即可,其它逻辑和WinForms一致
        var result = MessageBox.Show("是否发送错误报告?", "错误", MessageBoxButton.YesNoCancel);
        switch (result)
        {
            case MessageBoxResult.Yes:
                Crashes.NotifyUserConfirmation(UserConfirmation.Send);
                break;
            case MessageBoxResult.OK:
                Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);
                break;
            default:
                Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
                break;
        }
    });
    return true;
};
额外注意事项
  • 你当前的回调赋值顺序(先赋值ShouldAwaitUserConfirmation再调用AppCenter.Start)是正确的,不要调整顺序,否则回调不会生效
  • 如果需要处理程序启动阶段就触发的历史崩溃上报,要确保你用的同步上下文/Dispatcher在赋值回调前已经完成初始化,不要在窗体构造函数之外提前捕获未初始化的上下文

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:24:10