我正在使用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;
}
我认为可能显示一个模态形式对应用程序状态做了一些事情,但经过测试我看到我是否显示模态形式没有任何区别。仍然是冻结的主窗口,而不是关闭。
编辑:测试时我一定做错了。如果我不显示错误表单,它实际上应该工作。
有什么想法吗?
答案 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();
}