0

我正在使用 MonoMac 为 OSX 开发一个简单的应用程序。当我的应用程序遇到未处理的异常时,我会通过以下方式捕获它们:

AppDomain.CurrentDomain.UnhandledException += (sender, e) => Unhandled(e.ExceptionObject as Exception);

在函数 Unhandled() 中,我记录异常并运行模式窗口以通知用户出现问题。

然后我通过在应用程序的某个地方抛出一个常规异常来继续测试它。崩溃报告窗口按原样出现,并记录错误。

但是在关闭此窗口后,我希望应用程序退出,如果我没有发现错误,它会这样做。它不是; 应用程序的主窗口和停靠图标仍然存在,但窗口完全冻结。

如果我删除上面的代码行,应用程序在崩溃时会完全关闭。

我尝试通过调用强制应用程序退出:

NSApplication.SharedApplication.Terminate(myAppDelegate);

但这似乎根本没有任何作用。我在应用程序的退出按钮中使用了完全相同的代码行,并且它按预期工作,因此在捕获未处理的异常后,应用程序状态必须有一些特别之处。但是什么?

为了以防万一,我在 AppDelegate 中覆盖了以下内容,但这似乎没有任何区别:

public override NSApplicationTerminateReply ApplicationShouldTerminate (NSApplication sender)
{
    return NSApplicationTerminateReply.Now;
}

我认为显示模态表单可能会对应用程序状态产生影响,但经过测试,我发现是否显示模态表单没有任何区别。仍然是冻结的主窗口而不是关闭。

编辑:测试时我一定做错了什么。如果我不显示错误表单,它实际上可以正常工作。

有任何想法吗?

4

1 回答 1

1

我没有确切的答案,并且评论不会​​包含我的代码示例;但我可以告诉你,我在概念上在我的应用程序中做几乎完全相同的事情,它工作得很好。我的代码:

private static void OnException(Exception ex)
{
    new NSObject().InvokeOnMainThread(() => {
        try 
        {
            using (ErrorWindowController frmErrorMessage = new ErrorWindowController(ex)) 
            {
                Console.WriteLine(ex);
                    NSApplication.SharedApplication.RunModalForWindow(frmErrorMessage.Window);
            }
        } 
        finally 
        {
                NSApplication.SharedApplication.Terminate(NSApplication.SharedApplication);
        }
    });
}

编辑:

确保在关闭窗口时停止模式会话,否则调用RunModalForWindow将永远不会返回。

我使用一个按钮关闭我的模态窗口,如下所示:

partial void butClose_Click(NSObject sender)
{
    this.Window.OrderOut(sender);
    this.Window.Close();

    NSApplication.SharedApplication.StopModal();
}
于 2013-04-17T13:46:41.817 回答