如何关闭在不同线程上运行多个窗口的WPF应用程序?

时间:2016-07-26 00:44:21

标签: c# .net wpf

我正在开发一个WPF应用程序,我需要在主窗口关闭时完全关闭。我打开并运行的程序可以打开另一个窗口(变量名称已更改,但这是逻辑):

private void NewWindowButton_Click(object sender, RoutedEventArgs e) {
    Thread WindowThread = new Thread(new ThreadStart(NewWindowThread));
    WindowThread.SetApartmentState(ApartmentState.STA);
    WindowThread.IsBackground = true;
    WindowThread.Start();
}

private void NewWindowThread() {
    var NewWindow = new NewWindow();
    NewWindow.Show();
    Dispatcher.Run();
}

当主窗口关闭时,我有关闭事件调用应用程序关闭方法,如下所示:

private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
    Application.Current.Shutdown();
}

这将关闭在与主窗口相同的线程中创建的所有窗口,但是这并没有关闭我在新线程中打开的其他窗口。当主窗口关闭时,如何确保关闭所有窗口?

编辑:链接的帖子仅部分回答了我的问题。使用函数Environment.Exit(0);用于关闭每个窗口,但它会导致我的所有窗口在单击X按钮后关闭大约2-3秒,而Application.Current.Shutdown();立即关闭窗口但是离开其他线程打开。在调用Shutdown之后,同一个线程上没有任何事情发生,所以我不需要在它之后返回一个返回语句。

2 个答案:

答案 0 :(得分:3)

您可以在关闭MainWindow时将项目属性中的ShutdownMode更改为关闭。在“Application.xaml”文件中更改

ShutdownMode="OnLastWindowClose"

ShutdownMode="OnMainWindowClose"

答案 1 :(得分:0)

我想出了一种方法来自己做,而不必通过创建一个线程列表来调用Environment.Exit(0);,然后调用线程调度程序的InvokeShutdown方法。以下是上面修改后的代码:

private List<Thread> threadList = new List<Thread>();

private void NewWindowButton_Click(object sender, RoutedEventArgs e) {
    Thread WindowThread = new Thread(new ThreadStart(NewWindowThread));
    threadList.Add(WindowThread);
    WindowThread.SetApartmentState(ApartmentState.STA);
    WindowThread.IsBackground = true;
    WindowThread.Start();
}

private void NewWindowThread() {
    var NewWindow = new NewWindow();
    NewWindow.Show();
    Dispatcher.Run();
}

private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    foreach (Thread thread in threadList)
    {
        Dispatcher.FromThread(thread).InvokeShutdown();
    }
    Application.Current.Shutdown();
}

这会导致单独的线程中的所有窗口在主窗口关闭时关闭,并且不会导致像Environment.Exit(0);那样的任何延迟。