2015-12-02 52 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()