我有一个简单的wpf应用程序,即使在我明确地将其关闭后仍然继续运行。
它与第三方应用程序集成,需要检查某些类型和特定内容的文档在初始化时是否已打开。
以下是初始化代码的一部分:
try
{
ActiveProductDoc = Automation.CATIA.ActiveDocument as ProductDocument;
}
catch
{
InvalidAssemblyShutdown("You must have an assembly open before you run the app");
}
if(ActiveProduct == null)
InvalidAssemblyShutdown("You must have one assembly open (not a part)");
ActiveProduct = ActiveProductDoc.Product;
这是InvalidAssemblyShutdown方法:
private void InvalidAssemblyShutdown(string message)
{
MessageBox.Show(message);
Close();
Application.Current.Shutdown();
}
我已将应用程序的ShutdownMode属性设置为OnMainWindowClose。
我目前正在进行用例测试,其中用户打开了错误的文档类型,因此ActiveProduct字段为null。 InvalidAssemblyShutdown方法按预期调用,但尽管如此,关闭调用后的初始化方法中的行仍然运行并引发异常。
任何想法是怎么回事?
我应该抛出异常并使用全局异常处理程序吗?
答案 0 :(得分:2)
如果您查看Application.Current.Shutdown
(link to source)的源代码,您会看到它使用Dispatcher.BeginInvoke()
启动关机。换句话说,关机在UI线程上获得 排队 。在精确的方法调用期间它不会生效,因此以下代码将继续执行。
如果在处理关闭请求时不希望运行某些代码,则需要在调用Application.Current.Shutdown
后立即退出代码。类似的东西:
if(ActiveProduct == null)
{
InvalidAssemblyShutdown("You must have one assembly open (not a part)");
return; // prevent further code execution.
}
对于它的价值,this.Close()
以类似的方式工作。因此,如果您有适当的流量控制,则根本不需要调用Application.Current.Shutdown
。您拨打this.Close()
就足够了。