0

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

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

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

问题是,当我关闭主应用程序时,附加窗口仍然打开,我需要手动关闭它。我在我的 to中设置 了ShutDownMode并覆盖了:App.xamlOnMainWindowCloseOnClosed

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

但这对我没有帮助。

4

4 回答 4

4

添加

thread.IsBackground = true;

在运行线程之前。

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

于 2013-06-26T15:17:21.793 回答
2

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

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

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

于 2013-06-27T10:12:43.613 回答
2

确保在应用程序退出之前您的线程已停止。您可以通过使用 Thread.Abort 或使用 Thread.Join 等待它来执行此操作。

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

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

于 2013-06-26T14:54:21.810 回答
1

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

_thread.Join();
于 2013-06-26T15:12:42.853 回答