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

时间:2013-03-19 23:17:20

标签: c# wpf multithreading

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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