C# 调用线程无法访问此对象,因为其他线程拥有它
因此,我正在用c#/wpf制作一个简单的破砖游戏。我在使用计时器时遇到了一个问题,我觉得这可能是一个简单的解决方案,但下面是发生的情况。无论何时触发t_appeased,它都会尝试调用Update(),但当它执行类似于OMG的操作时,我没有在正确的线程中,所以我不能这样做,先生。如何从正确的线程调用游戏中的方法?(是的,我知道代码很难看,而且有神奇的数字,但我只是在没有投入太多精力的情况下把它拼凑了出来。是的,我没有任何编程游戏的经验)C# 调用线程无法访问此对象,因为其他线程拥有它,c#,wpf,C#,Wpf,因此,我正在用c#/wpf制作一个简单的破砖游戏。我在使用计时器时遇到了一个问题,我觉得这可能是一个简单的解决方案,但下面是发生的情况。无论何时触发t_appeased,它都会尝试调用Update(),但当它执行类似于OMG的操作时,我没有在正确的线程中,所以我不能这样做,先生。如何从正确的线程调用游戏中的方法?(是的,我知道代码很难看,而且有神奇的数字,但我只是在没有投入太多精力的情况下把它拼凑了出来。是的,我没有任何编程游戏的经验) 公共部分类游戏:网格 { 公办学校; 公共桨p; 公共舞会
公共部分类游戏:网格
{
公办学校;
公共桨p;
公共舞会b;
定时器t;
公共游戏()
{
宽度=500;
高度=400;
t=新定时器(20);
p=新桨叶();
b=新球();
对于(int i=15;i<300;i+=15)
{
对于(int j=15;j<455;j+=30)
{
砖块br=新砖块();
br.余量=新厚度(j,i,j+30,i+15);
添加(br);
}
}
增加(p);
儿童。添加(b);
p、 焦点();
t、 自动重置=真;
t、 Start();
t、 已用+=新的ElapsedEventHandler(t_已用);
}
无效时间(对象发送方,ElapsedEventArgs e)
{
如果(正在运行)
{
更新();
}
}
无效更新()
{
b、 Update();//从t_事件调用Update时此处出错
}
void Begin()
{
运行=真;
b、 发起();
}
}
您应该改用该对象,它将确保计时器事件发布到正确的线程。计时器已用事件在线程池()的线程上触发,而不是在UI线程上触发。最好的方法是通过如下调用调用控件的调度程序:
yourControl.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Normal
, new System.Windows.Threading.DispatcherOperationCallback(delegate
{
// update your control here
return null;
}), null);
OMG我的线程不正确,所以我不能这样做,先生。
的API稍有不同。像ElapsedTimeEvent一样,它现在被命名为ticketvent。但在迁移到新的API之后,它在UI线程中工作得非常好!我喜欢.NET为几乎所有场合提供快速解决方案;)你能从链接的问题中添加更多信息吗。
yourControl.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Normal
, new System.Windows.Threading.DispatcherOperationCallback(delegate
{
// update your control here
return null;
}), null);
this.Dispatcher.Invoke((Action)(() =>
{
...// your code here.
}));