线程上的 WPF ShowDialog:需要停止调度程序?

问题描述 投票:0回答:1

我有一个控制台应用程序,它在类似于此示例的单独线程上打开模式 WPF 窗口:

http://web.archive.org/web/20230128060513/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 方法已经处理了这个问题吗?

c# wpf dispatcher
1个回答
0
投票

关于调用

Dispatcher.InvokeShutdown()
所描述的问题是,启动线程后,线程不会自然退出,直到
Dispatcher.Run()
方法返回,并且在您调用
InvokeShutdown()
之前它不会知道要执行此操作。请注意,这与 Winforms API 形成对比,在 Winforms API 中,您可以将
Form
实例引用传递给
Application.Run()
方法,并且当该
Form
实例关闭时,该方法将返回。

在调用

ShowDialog()
的情况下,不会创建新线程:对话框窗口在当前线程中处理。因此,显然不存在阻塞用于窗口的线程的风险;它是当前线程,并且您知道窗口关闭后它不会被阻塞,因为
ShowDialog()
方法将控制权返回给您自己的代码。

所以,不。在使用

InvokeShutdown()
的情况下,您无需担心调用
ShowDialog()

© www.soinside.com 2019 - 2024. All rights reserved.