我需要显示一个使用WPF从MTA线程创建的对话框。我创建一个新线程,将其设置为STA,并在那里显示对话框。但是我无法从文档中弄清楚我是否真的需要调用Dispatcher.Run()然后在线程终止之前关闭调度程序。
Thread thread = new Thread(() =>
{
SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
dialog = new MyDialog();
dialog.Closed += (sender, e) => Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
dialog.Show();
Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
thread.Join();
如果我改为执行以下操作,我发现行为似乎相同。
Thread thread = new Thread(() =>
{
dialog = new MyDialog();
dialog.ShowDialog();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
thread.Join();
我是否真的需要设置调度程序,还是创建一个WPF窗口并调用ShowDialog为我做这个?
我注意到Window构造函数调用Dispatcher.CurrentDispatcher,如果不存在,它将创建一个调度程序。但是我没有在构造函数或ShowDialog中看到对Dispatcher.Run的任何调用。