【问题标题】:Who owns the process / main thread?谁拥有进程/主线程?
【发布时间】:2011-08-10 23:38:48
【问题描述】:

我用两个窗口创建了新的 WPF 应用程序。

  1. MainWindow.xaml
  2. Window1.xaml

在MainWindow.xaml中增加了一个按钮,在按钮的点击事件中写了如下代码:

Window1 w = new Window1();
w.Show();

我单击该按钮 2-3 次,它打开了多个 Window1 实例。

到这里为止一切都很好。

现在,我关闭了 MainWindow,它并没有关闭 Windows1 的实例。

我在想,由于 MainWindow 是拥有进程的那个,如果它关闭,其余的子窗口将自动关闭。

我在 WinForms 应用程序中做了同样的项目,结果完全不同。在关闭 MainWindow 时,它确实关闭了其余的窗口。

我没有清楚地理解这个概念吗?谁能告诉我谁拥有 WPF 中的进程或主线程?

【问题讨论】:

标签: wpf multithreading process


【解决方案1】:

除非您设置window.Owner = mainWindow;,否则其他窗口不是您的 MainWindow 的子窗口

还有Application.MainWindow 属性,它设置哪个窗口实际上被视为“主”窗口。如果设置为OnMainWindowClose,这会影响Application.ShutdownMode


摘自Window.Owner参考:

当父窗口通过调用 ShowDialog 打开子窗口时,一个隐式的 在父窗口和子窗口之间建立关系。这种关系会强制执行某些行为,包括最小化、最大化和恢复。

当一个子窗口由 通过调用显示父窗口, 但是,子窗口不 与父母有关系 窗户。这意味着:

  • 子窗口没有对父窗口的引用。

  • 子窗口的行为不依赖于 父窗口;任何一个窗口都可以 覆盖另一个,或被最小化, 最大化,并独立恢复 其他的。

为了让你建立关系 在子窗口和父窗口之间 窗口,窗口支持的概念 所有权。所有权成立 当一个窗口的 Owner 属性 (拥有的窗口)设置为 引用另一个窗口(所有者 窗口)。

应用根类:System.Windows.Application

WPF Threading Model

【讨论】:

  • 好的。所以我添加了 w.Owner = this;在代码中,现在它的行为方式与我认为的一样。这给我留下了一个很大的想法:如果我有一个具有多个窗口的应用程序并且出现问题并且主窗口被关闭怎么办。其他窗口会挂在那里孤儿吗?谁负责终止流程?在 WinForms 应用程序中,我没有指定所有者,但它的行为仍然不同。为什么这里有断线?
  • 似乎他们只是决定实现不同的关系逻辑。在 Winforms 中,父子关系是自动形成的,在 WPF 中必须手动完成。如果“出现问题”,很少有一个窗口会自行关闭,通常整个应用程序都会终止; WPF 应用程序通常有一个 App 类,它是应用程序的根。
  • 做了更多的工作。在 WinForms 应用程序中,如果我不指定所有者,则子窗口的所有者为空。仍然 CLR 跟踪从主窗口打开的窗口,并在主窗口关闭时关闭它们,但在 WPF 应用程序中不会发生同样的事情。如果我在 WPF 应用程序中抛出运行时异常,它会关闭从主窗口创建的所有窗口。为什么行为不一样?我很困惑。
  • 好吧,WPF != Winforms,如果一切都一样,那么两者都没有意义。
  • 是的,但如果我正确理解问题,那么它可能会导致一些严重的内存泄漏。
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2019-04-30
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多