Dispatcher.CurrentDispatcher.BeginInvokeShutdown关闭主线程c#

时间:2013-09-04 11:50:39

标签: c# wpf multithreading

我正在使用

在单独的线程中打开一个wpf UI
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);

导致主线程/应用程序关闭,我不想要。

我不希望我的父应用程序关闭。

2 个答案:

答案 0 :(得分: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();
}
  

来自MSDN的Threading Model页面的多窗口,多线程部分。

更新>>>

此代码经过100%测试,肯定会在新主题中打开新的Window。如果您不想关闭其他Window,请不要调用将BeginInvokeShutdown关闭的Window方法。你在Dispatcher.CurrentDispatcher上调用它,它在MAIN线程上运行(MainWindow.xaml正在运行)。

答案 1 :(得分:1)

您必须在对话框的BeginInvokeShutdown上调用Dispatcher而不是Dispatcher.CurrentDispatcher

您的对话框已关闭事件处理程序应如下所示:

dialog.Closed += (sender, e) => dialog.Dispatcher.BeginInvokeShutdown();