线程上的 WPF ShowDialog:需要停止调度程序?
Posted
技术标签:
【中文标题】线程上的 WPF ShowDialog:需要停止调度程序?【英文标题】:WPF ShowDialog on thread: stop dispatcher needed? 【发布时间】:2015-12-02 08:05:25 【问题描述】:我有一个控制台应用程序,它在类似于此示例的单独线程上打开模式 WPF 窗口:
http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/
// 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 方法已经处理了吗?
【问题讨论】:
不幸的是,我需要这样做,因为我必须处理遗留应用程序。在某些情况下,该应用程序需要显示模式对话框。所以现在没有别的办法了。 如果您必须将对话框放入旧版应用程序中,我认为使用p-invoke 到MessageBox 将占用最小的空间。您不想过多地 WPF 化您的旧应用程序。 这是我的第一个方法。不是我的决定,但需要有不同的风格,需要 WPF。 【参考方案1】:关于调用Dispatcher.InvokeShutdown()
所描述的问题是,在启动线程后,在Dispatcher.Run()
方法返回之前,线程不会自然退出,并且在您调用@987654323 之前它不会知道这样做@。请注意,这与 Winforms API 形成对比,在 Winforms API 中,您可以将 Form
实例引用传递给 Application.Run()
方法,当 Form
实例关闭时,该方法将返回。
在调用ShowDialog()
的情况下,不会创建新线程:对话窗口在当前线程中处理。因此,显然没有阻塞用于窗口的线程的风险;它是当前线程,并且您知道在窗口关闭后它没有被阻塞,因为ShowDialog()
方法将控制权返回给您自己的代码。
所以,不。在您使用ShowDialog()
的情况下,您无需担心调用InvokeShutdown()
。
【讨论】:
以上是关于线程上的 WPF ShowDialog:需要停止调度程序?的主要内容,如果未能解决你的问题,请参考以下文章
wpf ShowDialog或者其他操作后 UI不动 最小化再次最大化后又恢复正常
WPF程序 当关闭一个窗体后,重新打开报错 关闭窗口之后无法设置 Visibility 或者调用 Show或ShowDialog