拥有WPF窗口的C#线程的生命周期

拥有WPF窗口的C#线程的生命周期,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个创建WPF窗口并显示它的UI线程。 示例代码为: Thread thread = new Thread(() => { Window window = new Window(); window.Show(); Dispatcher.Run(); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); 在这段代码中,主进程将创建一个线程,WP

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

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

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

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


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

是否更容易询问,或者只是设置一个断点并进行检查?在线程上设置一个断点并观察输出窗口。“在任何合理的设计策略中都是不合理的”是这个答案的关键部分。