Открыть диалог 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.

0 ответов

Другие вопросы по тегам