Gameloop线程动态生成的对象不能在视图中访问
本文关键字:不能 视图 访问 对象 线程 动态 Gameloop | 更新日期: 2023-09-27 18:11:54
在c# WPF中,我有一个游戏,我用一个线程加载游戏,并在结束时启动游戏循环线程。一切都好。
BUT:当gamelloop线程动态地制作射体(射体扩展图像)对象时,事情会出错。首先我得到:线程必须是STA,因为许多ui组件需要这个。所以我设置了公寓状态。然后,当我将对象传递给视图并尝试通过以下方法将其添加到画布上的子元素时:
public void addBaseElement(Image projectile)
{
this.Dispatcher.Invoke((Action)(() =>
{
myCanvas.Children.Add(projectile);
}));
}
我得到这个错误:"调用线程不能访问这个对象,因为它是另一个线程拥有的。"
在本网站上的所有类似问题中,这个错误的答案都是:只需添加:
this.Dispatcher.Invoke((Action)(() =>
{
//Your code here
}));
,它会很好,这有时很有用。但在这种情况下,它不能解决问题。有什么建议吗?
编辑:标记副本的问题有以下解决方案:
在视图中动态创建对象我很抱歉,但这不是一个足够的解决方案,如果我这样做,我的项目的整个架构将不得不改变。动态创建的对象必须在游戏循环线程中创建。在我看来,这是唯一一种干净且具有良好架构的方法。
你调查了吗->
SynchronizationContext.Current.Post
JarredPar在这篇文章中建议。
编辑:我只是写你应该在UI(主-游戏循环)线程上创建UI元素,当我看到你对问题的编辑;但我认为这是你唯一的出路。如果你的图像来自另一个线程,你可能不得不在UI线程上重新建立/复制它们,并将它们添加到画布上。抱歉,这会造成开销