Открыть диалог WPF в новой ветке STA
Мне нужно показать диалоговое окно, созданное с помощью 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, который создаст диспетчер, если он не существует. Но я не вижу никаких вызовов Dispatcher.Run в конструкторе или ShowDialog.