拥有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窗口关闭,线程会终止吗?
如果你只是编译这个并尝试,你会发现当窗口关闭时线程并没有终止。这是因为您使用Dispatcher.Run()
启动线程处理消息循环,这将在无限循环中继续,直到您告诉它停止。这样做的原因是一个新的WPF应用程序开始调用Application.Run(MyMainWindow)
-在这个线程中,然而,window
属于这个线程,Dispatcher
属于这个线程,但是Dispatcher
不属于window
,所以关闭窗口对调度程序没有任何影响。
在Winforms中,你可以通过在线程内调用Application.Run(MyForm)
来破解第二个UI线程,但据我所知,WPF不允许这样做。您不能在辅助线程中访问Application.Current
,也不能在线程中创建和运行Application
的新实例。如果您真的、真的需要第二个消息循环——我觉得这在任何明智的设计策略中都是不合理的——您将需要编写清理代码,以确保线程的Dispatcher关闭并终止线程。