Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用线程无法访问此对象,因为其他线程拥有它_C#_Wpf - Fatal编程技术网

C# 调用线程无法访问此对象,因为其他线程拥有它

C# 调用线程无法访问此对象,因为其他线程拥有它,c#,wpf,C#,Wpf,因此,我正在用c#/wpf制作一个简单的破砖游戏。我在使用计时器时遇到了一个问题,我觉得这可能是一个简单的解决方案,但下面是发生的情况。无论何时触发t_appeased,它都会尝试调用Update(),但当它执行类似于OMG的操作时,我没有在正确的线程中,所以我不能这样做,先生。如何从正确的线程调用游戏中的方法?(是的,我知道代码很难看,而且有神奇的数字,但我只是在没有投入太多精力的情况下把它拼凑了出来。是的,我没有任何编程游戏的经验) 公共部分类游戏:网格 { 公办学校; 公共桨p; 公共舞会

因此,我正在用c#/wpf制作一个简单的破砖游戏。我在使用计时器时遇到了一个问题,我觉得这可能是一个简单的解决方案,但下面是发生的情况。无论何时触发t_appeased,它都会尝试调用Update(),但当它执行类似于OMG的操作时,我没有在正确的线程中,所以我不能这样做,先生。如何从正确的线程调用游戏中的方法?(是的,我知道代码很难看,而且有神奇的数字,但我只是在没有投入太多精力的情况下把它拼凑了出来。是的,我没有任何编程游戏的经验)

公共部分类游戏:网格
{
公办学校;
公共桨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.
}));