C# 关闭应用程序时,并非所有窗口都关闭

C# 关闭应用程序时,并非所有窗口都关闭,c#,wpf,window,C#,Wpf,Window,我有一个应用程序,其中一个为我的图形创建一个新窗口。我用下一种方式创建它: var thread = new Thread(() => { var win = new MyWindow(); win.Show(); Dispatcher.Run(); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); 问题是,当我关闭主应用程序时,附加窗口仍然打开,我需要手动关闭它。我将App.xa

我有一个应用程序,其中一个为我的图形创建一个新窗口。我用下一种方式创建它:

var thread = new Thread(() =>
{
    var win = new MyWindow();
    win.Show();
    Dispatcher.Run();
});

thread.SetApartmentState(ApartmentState.STA);
thread.Start();
问题是,当我关闭主应用程序时,附加窗口仍然打开,我需要手动关闭它。我将App.xaml中的关机模式设置为OnMainWindowClose,并在关闭时覆盖:


但这对我没有帮助。

请确保在应用程序退出之前停止线程。 您可以使用Thread.Abort或使用Thread.Join等待

但这些都是令人讨厌的结束或等待线索的方式。最好的方法是使用bool来阻止它运行

以下是如何以干净的方式停止线程:

保留对生成的线程的引用,当退出应用程序时,您可能会通过一个。之后,您必须等待线程通过加入它退出

_thread.Join();

在运行线程之前


请参阅

如果要在窗口之间建立关系,应设置新窗口的所有者属性,从而:

var childWindow = new ChildWindow();
childWindow.Owner = this;
childWindow.Show();

现在,如果关闭主窗口,其所有子窗口也将关闭。

请尝试Environment.Exit0;或Process.GetCurrentProcess.Kill;你需要公寓吗?这不是造成这种行为的原因吗?@AhmedKRAIEM这是一种确保应用程序停止的方法,但这是一种残忍的方法,而不是最干净的方法。@AhmedKRAIEM虽然这是一个有效的答案:但是……你为什么要这样做?这样做可以有效地生成一个新的应用程序。这真的是您想要实现的吗?谢谢您的回答,但是设置threat.IsBackground=true也有帮助。有人能解释一下这里发生了什么吗?@C4stor后台线程不会阻止进程关闭。
thread.IsBackground = true;
var childWindow = new ChildWindow();
childWindow.Owner = this;
childWindow.Show();