当我的主窗口渲染时,我需要创建加载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
是在上一行中创建的,并且在同一个帖子中。
答案 0 :(得分:0)
在您创建控件的loadingThreadWork
中,在第一次运行之前它是null
,所以在您第一次成功时。但是,您在另一个线程中创建对话框,该线程被标记为控件的所有者。
在您下次调用loadingThreadWork
时,控件不为空,并且ant会从另一个线程更改它(并且它是一个不同的线程,因为您'重新创建它会导致你获得的例外。
如你'再使用WPF
,则或许应该从线程切换到async
操作,这是更可读,可支持的和可预测的比当前解决方案