[英]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.