在未处理的异常之后,NSApplication.SharedApplication.Terminate实际上并未终止我的应用程序

时间:2013-04-16 14:38:44

标签: terminate monomac nsapplication

我正在使用MonoMac为OSX开发一个简单的应用程序。当我的应用程序遇到未处理的异常时,我会抓住它们:

  

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

在函数Unhandled()中,我记录异常并运行一个模态窗口来通知用户出错了。

然后我通过在应用程序中的某处抛出常规异常来继续测试。崩溃报告窗口按原样显示,并记录错误。

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

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

我尝试通过调用:

强制退出应用程序
NSApplication.SharedApplication.Terminate(myAppDelegate);

但这似乎什么都不做。我在应用程序的Quit按钮中使用完全相同的代码行,并且它按预期工作,因此在捕获未处理的异常后,应用程序状态必须有一些特殊内容。但是什么?

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

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

我认为可能显示一个模态形式对应用程序状态做了一些事情,但经过测试我看到我是否显示模态形式没有任何区别。仍然是冻结的主窗口,而不是关闭。

编辑:测试时我一定做错了。如果我不显示错误表单,它实际上应该工作。

有什么想法吗?

1 个答案:

答案 0 :(得分: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();
}