如何将窗口运行到新任务并保持其主线程运行

时间:2016-04-16 15:55:10

标签: c# wpf multithreading dispatcher

使用WPF / MVVM应用程序。 从我的主线程向新任务显示MVC窗口并让我的主线程继续运行其下一条指令而不等待窗口关闭的最佳方法是什么?

我想运行以下内容:

  Window window = new Window();
    View view = new View();
    ViewModel viewModel = new ViewModel();
    window.Content = view;

window.Show();

... program then continues with business stuff

显然,如果我跑

 window.Show();

窗口立即返回并关闭。

如果我使用

 window.ShowDialog()

线程等待用户关闭窗口,这不是我想要的,因为我需要接下来的说明才能继续。

我想我需要将窗口运行到新线程中,但这会带来额外的问题:

 Task.Run(() => window.ShowDialog())); 

这不起作用,因为窗口被创建为不同的东西。

所以我想我需要使用一个调度程序来允许在新任务中运行window.ShowDialog:

Task.Run(() => Application.Current.Dispatcher.Invoke(() => window.ShowDialog() ));

但这也不起作用。虽然编译器接受它并且它不会在运行时抛出异常,但永远不会打开窗口。如果我逐步调试模式,我可以看到调试器永远不会在新任务中输入匿名。

这应该很简单,但我无法解决这个问题。 感谢您事先提供的帮助。

1 个答案:

答案 0 :(得分:3)

Window.Show()不会阻止该帖子。它也不会立即返回,直到用户关闭另一个窗口(或者您以编程方式关闭它)。这可能是你想要的。

如果你想为你的主窗口和你的MVC窗口提供单独的UI线程,你可以在另一个线程中启动你的新窗口并为你的新UI线程做必要的管道。

var thread = new Thread(() =>
                        {
                            SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));

                            Window window = new Window();
                            View view = new View();
                            ViewModel viewModel = new ViewModel();
                            window.Content = view;

                            // When the window closes, shut down the dispatcher
                            window.Closed += (s, args) =>
                                                 Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

                            window.Show();

                            // Start the Dispatcher Processing
                            Dispatcher.Run();
                        });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

有关详细信息,请参阅this@Reed Copsey博文。