首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭在不同线程上运行多个窗口的WPF应用程序?

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

Stack Overflow用户
提问于 2016-07-26 08:44:21
回答 2查看 2K关注 0票数 3

我正在处理一个WPF应用程序,当主窗口关闭时,我需要完全关闭它。我打开并运行的程序还可以打开另一个窗口,如下所示(变量名称已更改,但逻辑如下):

代码语言:javascript
复制
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();
}

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

代码语言:javascript
复制
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
    Application.Current.Shutdown();
}

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-07-26 15:59:18

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

代码语言:javascript
复制
ShutdownMode="OnLastWindowClose"

代码语言:javascript
复制
ShutdownMode="OnMainWindowClose"
票数 3
EN

Stack Overflow用户

发布于 2016-07-26 10:43:08

我自己找到了一种方法,不需要调用Environment.Exit(0);,而是创建一个线程列表,然后调用线程分派器的InvokeShutdown方法。下面是上面修改过的代码:

代码语言:javascript
复制
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);那样造成任何延迟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38579468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档