在新的STA线程中打开WPF对话框

时间:2017-04-20 21:27:45

标签: c# wpf multithreading dispatcher

我需要显示一个使用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的任何调用。

0 个答案:

没有答案