我有一个控制台应用程序,它在类似于此示例的单独线程上打开模式 WPF 窗口:
// Create a thread
Thread newWindowThread = new Thread(new ThreadStart( () =>
{
// Create and show the Window
Window1 tempWindow = new Window1();
tempWindow.Show();
// Start the Dispatcher Processing
System.Windows.Threading.Dispatcher.Run();
}));
但我使用 ShowDialog 而不是 Show。
我看到的是,在这种情况下我不需要启动调度程序线程。 ShowDialog 似乎是在幕后做的。
但是调度程序线程的关闭又如何呢?在这种情况下,我是否需要通过调用 InvokeShutdown 来明确执行此操作? 或者窗口上的 close 方法已经处理了这个问题吗?
关于调用
Dispatcher.InvokeShutdown()
所描述的问题是,启动线程后,线程不会自然退出,直到 Dispatcher.Run()
方法返回,并且在您调用 InvokeShutdown()
之前它不会知道要执行此操作。请注意,这与 Winforms API 形成对比,在 Winforms API 中,您可以将 Form
实例引用传递给 Application.Run()
方法,并且当该 Form
实例关闭时,该方法将返回。
在调用
ShowDialog()
的情况下,不会创建新线程:对话框窗口在当前线程中处理。因此,显然不存在阻塞用于窗口的线程的风险;它是当前线程,并且您知道窗口关闭后它不会被阻塞,因为 ShowDialog()
方法将控制权返回给您自己的代码。
所以,不。在使用
InvokeShutdown()
的情况下,您无需担心调用 ShowDialog()
。