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

时间:2013-06-26 14:51:42

标签: c# wpf window

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

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

thread.SetApartmentState(ApartmentState.STA);
thread.Start();

问题是,当我关闭主应用程序时,其他窗口仍然打开,我需要手动关闭它。我将App.xaml中的 ShutDownMode 设置为OnMainWindowClose并覆盖OnClosed

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);
    Application.Current.Shutdown();
}

但它对我没有帮助。

4 个答案:

答案 0 :(得分:4)

添加

thread.IsBackground = true;

在运行线程之前。

请参阅http://msdn.microsoft.com/en-us/library/ms741870.aspx

答案 1 :(得分:2)

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

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

以下是如何以“干净”的方式阻止你的线程: https://stackoverflow.com/a/10664959/1661209

答案 2 :(得分:2)

如果要在窗口之间建立关系,则应设置新窗口的Owner属性:

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

现在,如果你关闭主窗口,它的所有孩子也会关闭。

答案 3 :(得分:1)

保持对您生成的线程的引用,并在退出应用程序时,通知线程退出某些线程(可能通过ManualResetEvent)。之后,你必须通过加入它来等待线程退出。

_thread.Join();