如何 运行 一个 window 进入一个新任务并保持其主线程 运行ning
How to run a window into a new task and keep its main thread running
正在开发 WPF/MVVM 应用程序。
将主线程中的 MVC window 显示到新任务中并让主线程保持 运行 下一条指令而不等待 window 关闭的最佳方法是什么?
我想运行以下内容:
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立即returns并关闭。
如果我用
window.ShowDialog()
线程等待 window 被用户关闭,这不是我想要的,因为我需要下一条指令才能继续。
我想我需要 运行 将 window 放入一个新线程,但这会带来额外的问题:
Task.Run(() => window.ShowDialog()));
这也不起作用,因为 window 被创建为不同的东西。
所以我想我需要使用调度程序才能在新任务中 运行 window.ShowDialog:
Task.Run(() => Application.Current.Dispatcher.Invoke(() => window.ShowDialog() ));
但这也不管用。虽然编译器接受它并且它不会在 运行 时抛出异常,但 window 永远不会打开。如果我在逐步模式下调试,我可以看到调试器永远不会在新任务中进入 then anonymous。
这应该很简单,但我就是没能解决这个问题。
感谢您提前提供的帮助。
Window.Show()
不会阻塞线程。它也不会立即 return 直到用户关闭另一个 window (或者您以编程方式关闭它)。所以这可能就是你想要的。
如果您想为 Main window 和 MVC window 设置单独的 UI 线程,您可以在另一个线程中启动新的 Window 并执行新 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 blog post from @Reed Copsey。
正在开发 WPF/MVVM 应用程序。 将主线程中的 MVC window 显示到新任务中并让主线程保持 运行 下一条指令而不等待 window 关闭的最佳方法是什么?
我想运行以下内容:
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立即returns并关闭。
如果我用
window.ShowDialog()
线程等待 window 被用户关闭,这不是我想要的,因为我需要下一条指令才能继续。
我想我需要 运行 将 window 放入一个新线程,但这会带来额外的问题:
Task.Run(() => window.ShowDialog()));
这也不起作用,因为 window 被创建为不同的东西。
所以我想我需要使用调度程序才能在新任务中 运行 window.ShowDialog:
Task.Run(() => Application.Current.Dispatcher.Invoke(() => window.ShowDialog() ));
但这也不管用。虽然编译器接受它并且它不会在 运行 时抛出异常,但 window 永远不会打开。如果我在逐步模式下调试,我可以看到调试器永远不会在新任务中进入 then anonymous。
这应该很简单,但我就是没能解决这个问题。 感谢您提前提供的帮助。
Window.Show()
不会阻塞线程。它也不会立即 return 直到用户关闭另一个 window (或者您以编程方式关闭它)。所以这可能就是你想要的。
如果您想为 Main window 和 MVC window 设置单独的 UI 线程,您可以在另一个线程中启动新的 Window 并执行新 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 blog post from @Reed Copsey。