线程上的 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 窗口弹出问题

wpf ShowDialog或者其他操作后 UI不动 最小化再次最大化后又恢复正常

WPF程序 当关闭一个窗体后,重新打开报错 关闭窗口之后无法设置 Visibility 或者调用 Show或ShowDialog

使用 form.ShowDialog() 时,主窗体中的线程不起作用

使用不同的线程更新 GUI (WPF)

调用 ShowDialog() 后继续执行代码