繁体   English   中英

不同STA线程中的WPF娱乐窗口

[英]WPF Recreation window in different STA thread

我的主窗口正在渲染时,我需要创建一个加载gif的窗口。 我已经阅读了一些文章,并决定要为此目的创建一个新线程。 我做到了这篇文章

结果,我有这样的事情:

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 ,控件不是null,并且从其他线程(并且它是另一个线程,因为您是在重新创建它)对其进行ant更改会导致异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM