2013-09-04 2 views
0

Я открывающий Wpf UI в отдельном потоке с помощьюDispatcher.CurrentDispatcher.BeginInvokeShutdown закрывает главный поток C#

helperThread = new Thread(() => 
{ 
    //ShowHelpInDialog(e.Url, -1, -1, -1, -1, e.HelpContext); 
    //System.Windows.Threading.Dispatcher.Run(); 
    dispatcher.Invoke(new Action(() => ShowHelpInDialog(e.Url, -1, -1, -1, -1, e.HelpContext))); 

}); 
helperThread.SetApartmentState(ApartmentState.STA); 
helperThread.IsBackground = true; 
helperThread.Start(); 

Во время диалога близкого случая, я называю

Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background); 

, которая вызывает главной thread/Application to close, Который я не хочу.

Я не хочу, чтобы мое родительское приложение закрывалось.

+1

Хорошее форматирование всегда ваш друг. –

+3

Что вы ожидали от BeginInvokeShutdown? –

+0

Я использую BeginInvokeShutdown для освобождения памяти. – user2746708

ответ

1

Обратите внимание на следующий пример о том, как открыть новый Window из другого потока:

private void NewWindowHandler(object sender, RoutedEventArgs e) 
{  
    Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint)); 
    newWindowThread.SetApartmentState(ApartmentState.STA); 
    newWindowThread.IsBackground = true; 
    newWindowThread.Start(); 
} 

private void ThreadStartingPoint() 
{ 
    Window1 tempWindow = new Window1(); 
    tempWindow.Show();  
    System.Windows.Threading.Dispatcher.Run(); 
} 

Из нескольких окон, Множественные Темы раздела Threading Model страницы на сайте MSDN.

UPDATE >>>

Этот код 100% тестирование и, безусловно, откроет новую Window в новом потоке. Если вы не хотите выключать другие Window, тогда не вызывайте метод BeginInvokeShutdown, который закрывает Window. Вы вызываете его на Dispatcher.CurrentDispatcher, который работает в потоке MAIN (где работает MainWindow.xaml).

+0

Я просто последовал тому же, но все еще закрывает родительский диалог. – user2746708

+0

См. Мое обновление. – Sheridan

1

Вам необходимо будет вызвать BeginInvokeShutdown в диалоговом окне Dispatcher не на Dispatcher.CurrentDispatcher.

Ваш диалог Обработчик закрытое мероприятие должно выглядеть следующим образом:

dialog.Closed += (sender, e) => dialog.Dispatcher.BeginInvokeShutdown(); 
Смежные вопросы