【问题标题】:My WPF app still running if I open another Window如果我打开另一个窗口,我的 WPF 应用程序仍在运行
【发布时间】:2009-07-12 14:38:04
【问题描述】:

我正在使用 mvvm 工具包编写 WPF 应用程序。

在主窗口中,我在一个按钮中有一个命令,可以使用以下命令打开另一个窗口:

catView.ShowDialog();

好吧,我关闭了那个窗口(使用关闭按钮或 X),当我关闭主窗口时,应用程序仍在运行,我必须终止它。

如果我不打开第二个窗口,应用程序会正常关闭。

为什么我打开另一个窗口无法正常关闭应用?

我在第二个窗口的关闭按钮中有这个:

this.DialogResult = true;
this.Close();

另一方面,我以这种方式启动应用程序(mvvm工具包方式):

Views.MainView view = new Views.MainView();
view.DataContext = new ViewModels.MainViewModel();
view.Show();

非常感谢。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    这个问题可能与打开和关闭窗口无关,而是在那个窗口内。

    这通常发生在当您关闭应用程序时仍有另一个线程仍在运行时,检查窗口代码中是否有任何可能创建新线程的内容(包括 System.Threading.Thread、ThreadPool、BackgroundWorker 和 3rd 方组件),确保在关闭应用程序之前关闭所有后台线程(或者如果您无法关闭它们,至少将它们标记为后台线程)。

    同时寻找可以打开另一个(不可见)窗口的任何东西,通常使用到不可见窗口的窗口消息作为进程间通信机制,再次寻找可能这样做的第 3 方代码。

    【讨论】:

    • 有趣的是它不再发生了。我不知道我是否更改了导致错误的 Windows 中的某些内容或只是消失了。谢谢。
    【解决方案2】:

    Nir 是正确的,一个线程可能仍在您的另一个窗口中运行。

    您可以通过在窗口关闭时终止应用程序的线程调度程序来解决此问题。

    public Window1()
    {
        InitializeComponent();
    
        // This line should fix it:
        this.Closed += (sender, e) => this.Dispatcher.InvokeShutdown();
    }
    

    如果这不是正确的做事方式,我很高兴得到纠正。不过对我来说效果很好。

    PS。 如果您的其他窗口设计为在不同的线程中运行,请阅读 Eugene Prystupa 的这篇文章: running-wpf-application-with-multiple-ui-threads

    【讨论】:

      【解决方案3】:

      我不知道这是否会导致您的问题,但您不需要在第二个窗口中调用 Close()。设置DialogResult 自动关闭窗口。

      【讨论】:

      • 窗口关闭时没有 Close() 但这并不能解决问题。即使使用 Show(),问题仍然存在。
      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多