2015-12-02 8 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 вместо Show. Я вижу, что в этом случае мне не нужно запускать диспетчерскую нить. ShowDialog, похоже, делает это под гулом. Но как насчет отключения диспетчерской нитки? Должен ли я сделать это явно в этом случае, вызвав 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-ify для своего устаревшего приложения. – MickyD

+0

Это был мой первый подход. Не мое решение, но есть необходимость иметь другой стиль, который требует WPF. – DanielG

ответ

0

Озабоченность быть описаны в отношении вызова Dispatcher.InvokeShutdown() является то, что, начав нить, нить не выйдет, естественно, пока Dispatcher.Run() метод возвращает, и он не будет знать, чтобы сделать это, пока вы не вызовете InvokeShutdown(). Обратите внимание, что это отличается от API Winforms, в котором вы можете передать ссылку на экземпляр Form на метод Application.Run(), и метод там вернется, когда экземпляр Form был закрыт.

В случае вызова ShowDialog() новый поток не создается: диалоговое окно обрабатывается в текущем потоке. Таким образом, очевидно, что нет никакого риска блокировать поток, используемый для окна; это текущий поток, и вы знаете, что он не заблокирован после закрытия окна, потому что метод ShowDialog() возвращает управление вашему собственному коду.

Итак, нет. Вам не нужно беспокоиться о вызове InvokeShutdown() в том случае, если вы используете ShowDialog().

Смежные вопросы