c# - 调用线程无法访问此对象,因为另一个线程拥有它

标签 c# wpf

所以我正在用 c#/wpf 制作一个简单的打砖 block 游戏。我在使用计时器时遇到问题,我觉得这可能是一个简单的修复,但这是发生了什么。每当 t_Elapsed 被触发时,它都会尝试调用 Update(),但是当它调用时,天哪,我不在正确的线程中,所以我不能那样做,先生。如何从正确的线程调用游戏中的方法? (是的,我知道代码很丑陋并且有神奇的数字,但我只是在没有付出很多努力的情况下就把它弄出来了。是的,我对编程游戏的经验为零)

public partial class Game : Grid
{
    public bool running;
    public Paddle p;
    public Ball b;
    Timer t;

    public Game()
    {
        Width = 500;
        Height = 400;
        t = new Timer(20);
        p = new Paddle();
        b = new Ball();
        for (int i = 15; i < 300; i += 15)
        {
            for (int j = 15; j < 455; j += 30)
            {
                Brick br = new Brick();
                br.Margin = new Thickness(j, i, j + 30, i + 15);
                Children.Add(br);
            }
        }
        Children.Add(p);
        Children.Add(b);
        p.Focus();
        t.AutoReset = true;
        t.Start();
        t.Elapsed += new ElapsedEventHandler(t_Elapsed);
    }

    void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (running)
        {
            Update();
        }
    }

    void Update()
    {
        b.Update(); //Error here when Update is called from t_Elapsed event
    }

    void Begin()
    {
        running = true;
        b.Initiate();
    }
}

最佳答案

你应该使用 DispatcherTimer相反,它将确保将计时器事件发布到正确的线程。

关于c# - 调用线程无法访问此对象,因为另一个线程拥有它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3094911/

相关文章:

c# - 如何在不创建 List<string> 的情况下将图像源绑定(bind)到路径列表?

c# - 如何将 Wpf 项目迁移到新的 VS2017 格式

c# - 如何在 C# 摘要中包含 html 标记,以便将其作为文本处理(而不是解析为 XML)?

c# - GC 是否收集 Binding Mode OneTime?

c# - DataGridView 中的 wpf 双列

wpf - 根据 DataContext 的类型选择用户控件

c# - 访问属性内的属性

c# - 为什么在 C# 中,在默认情况下切换循环中需要 break?

c# - 将 Entity Framework 与现有模型结合使用

c# - 突出显示 WPF 数据网格中的单元格时没有可见文本