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

本文关键字:生命 周期 线程 窗口 拥有 WPF | 更新日期: 2023-09-27 18:04:41

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

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

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

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

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

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