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

本文关键字:线程 CurrentDispatcher BeginInvokeShutdown Dispatcher | 更新日期: 2023-09-27 18:30:12

我正在使用在一个单独的线程中打开一个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);

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

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

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

请观察以下关于如何从另一个线程打开新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,那么不要调用会关闭WindowBeginInvokeShutdown方法。您在运行在MAIN线程上的Dispatcher.CurrentDispatcher上调用它(MainWindow.xaml正在运行)。

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

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

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