0

我有一个创建 WPF 窗口并显示它的 UI 线程。示例代码将是:

Thread thread = new Thread(() => 
    {
        Window window = new Window();
        window.Show();
        Dispatcher.Run();
    });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

在此代码中,主进程将创建一个线程,并从该线程创建 WPF 窗口。线程的生命周期是否与 WPF Window 相同?如果 WPF 窗口关闭,线程会终止吗?

4

1 回答 1

2

如果你只是编译这个并尝试你会发现当窗口关闭时线程并没有终止。这是因为您启动了处理消息循环的线程,Dispatcher.Run()并且这将在无限循环中继续,直到您告诉它停止。这样做的原因是一个新的 WPF 应用程序开始时调用Application.Run(MyMainWindow)- 在这个线程中,但是,window属于该线程并Dispatcher属于该线程,但Dispatcher不属于window,因此关闭窗口对调度程序没有任何作用。

在 Winforms 中,您可以通过从线程内调用来破解第二个 UI 线程,Application.Run(MyForm)但据我所知,WPF 不允许这样做。您不能Application.Current从辅助线程内访问,也不能从线程内创建和运行新实例Application。如果你真的真的需要第二个消息循环——我觉得这在任何明智的设计策略中都可能不合理——你需要编写清理代码以确保线程的 Dispatcher 关闭并终止线程。

于 2013-03-20T00:22:58.477 回答