不同 STA 线程中的 WPF Recreation window

WPF Recreation window in different STA thread

我需要创建 window 并在我的主要 window 渲染时加载 gif。我已经阅读了一些文章并决定为此目的我需要创建新线程。我在 this article

中做到了

结果我有这样的东西:

LoadingDialog _loadingDlg;
Thread loadingThread;

public void ShowLoading()
{
    loadingThread = new Thread(new ThreadStart(loadingThreadWork));
    loadingThread.SetApartmentState(ApartmentState.STA);
    loadingThread.Start();
}

private void loadingThreadWork()
{
    _loadingDlg = new LoadingDialog();
    _loadingDlg.Show();
    System.Windows.Threading.Dispatcher.Run();
}

public void HideLoading()
{
    _loadingDlg.Dispatcher.InvokeShutdown();
}

我第一次调用 ShowLoading() 然后 HideLoading() 一切正常。但是当我第二次调用 ShowLoading() 时,我在

处遇到异常
_loadingDlg.Show();

有消息 The calling thread cannot access this object because a different thread owns it

怎么会这样? _loadingDlg 是在上一行创建的,并且在同一个线程中。

loadingThreadWork 中,您正在创建控件,在第一个 运行 之前,它是一个 null,因此您第一次成功。但是,您是在另一个线程中创建对话框,该线程被标记为控件的所有者。

下次调用 loadingThreadWork 时,控件不为空,并且 ant 从不同的线程更改它(它是不同的线程,因为你再次创建它) 导致你遇到异常。

当您使用 WPF 时,您可能应该从线程切换到 async 操作,这比您当前的解决方案更具可读性、可支持性和可预测性。