即使在显式关闭后,WPF应用程序也会继

时间:2016-05-25 13:54:13

标签: wpf

我有一个简单的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方法按预期调用,但尽管如此,关闭调用后的初始化方法中的行仍然运行并引发异常。

任何想法是怎么回事?

我应该抛出异常并使用全局异常处理程序吗?

1 个答案:

答案 0 :(得分:2)

如果您查看Application.Current.Shutdownlink 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()就足够了。