2015-12-02 102 views
1

我得到了一个类似于此示例中一个单独的线程中打开一个模式WPF窗口控制台应用程序:线程上的WPF ShowDialog:停止调度程序需要?

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的,而不是显示。 我看到的是,在这种情况下,我不需要启动调度程序线程。 ShowDialog似乎是在hoot下做的。 但是关于调度程序线程的关闭呢?在这种情况下,我是否需要明确地通过呼叫InvokeShutdown? 或者窗口句柄上的close方法已经完成了吗?

+0

不幸的是,我需要这样做,因为我必须处理遗留的应用程序。在某些情况下,该应用程序需要显示模式对话框。所以现在没有其他办法了。 – DanielG

+1

如果您必须将对话框放入遗留应用程序中,我会考虑使用[p-invoke](http://stackoverflow.com/questions/3364681/message-box-in-front-of-all-windows-in-console (应用程序)到[MessageBox](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v = vs.85).aspx)将具有最小的占用空间。你不想WPF,如果你的遗留应用程序太多。 – MickyD

+0

这是我的第一个方法。不是我的决定,但需要有一种不同的风格来满足WPF的需求。 – DanielG

回答

0

令人担忧的是对于描述调用Dispatcher.InvokeShutdown()的是,在已经开始的线程,该线程不会自然退出,直到Dispatcher.Run()方法返回,也不会知道这样做,直到你打电话InvokeShutdown()。请注意,这与Winforms API相反,您可以在其中将Form实例引用传递给Application.Run()方法,并且在关闭此Form实例时将返回该方法。

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

所以,没有。在您使用ShowDialog()的情况下,您无需担心致电InvokeShutdown()