c#do事件是否同步运行?

时间:2014-02-05 20:56:49

标签: c# multithreading events

我即将编写自己的碰撞检测代码。这就是它的工作原理:

  1. 我的对象施放移动事件。
  2. 我的世界/碰撞管理器侦听所有可移动物体的移动事件,并检查它们是否移动。
  3. 如果他们移动我检查碰撞并解决它们
  4. 现在问题是我的对象的移动速度有时会在以下代码中发生变化:

    private void OnObjectMove(StaticObject MovingObject)
        {
            if(maskCollision(MovingObject))
            {
                Console.WriteLine("===============================");
                Console.WriteLine("movementX: " + MovingObject.movement_Y.Speed + " movementY  " + MovingObject.movement_Y.Speed);
                resolveMaskCollision(MovingObject);
            }
        }
    

    和我的解决方案碰撞方法的开始:

    private void resolveMaskCollision(StaticObject collidingObject)
        {
            Console.WriteLine("movementX: "+collidingObject.movement_X.Speed + " movementY: " + collidingObject.movement_Y.Speed);
    .
    .
    .
    

    所以示例输出是:

    movementX: -8,700003 movementY  -8,700003
    movementX: 0 movementY: -8,700003
    

    你可以看到我的运动因某种原因而改变了......

    输出大多数时候都是相同的,但有时它不是,然后我的所有方法都会引发exeptions因为我不希望速度在那里改变。现在我对对象速度变化的唯一解释是事件在一个单独的线程上运行。 这是真的?我怎么能等待这个活动?如果可能的话,等待它是否聪明?或者它会减慢我的代码? (我可以以某种方式调用我的movingObject中的方法。但是它必须保存世界/ collisionmanager -object)

4 个答案:

答案 0 :(得分:2)

this answer所示,事件是同步的,除非你构建它们。

作为gamedev对我有用的,对你有用的是“脏位”的实现,它告诉对象是否已经改变(位置等),以避免不必要的调用计算上昂贵的方法。这允许您在移动每个对象时串行移动对象,测试碰撞。如果遇到性能问题,您还可以在3d系统中找到Quadtrees(或octrees)特别有用。

答案 1 :(得分:1)

@Adam Sears是对的,有你的答案,见:

MovingObject.movement_Y.Speed

VS。

collidingObject.movement_X.Speed

你将Y与X进行比较。

这两个方法在同一个线程中运行。

答案 2 :(得分:1)

对于事件是否在C#中异步运行的问题,类似的答案适用于如此多的问题:这取决于您(或者您编写要使用其事件的类的人)。在C#中实现事件的默认方式是在导致事件所代表的“事件”的同一线程中触发事件。但是,您可以以不同方式实现此部分并实现异步事件。

同步实现如下所示:

protected virtual void OnFoo(EventArgs e)
{
    if (Foo != null) Foo(this, e);
}

异步实现如下所示:

protected virtual void OnFooAsync(EventArgs e)
{
    if (Foo != null) Foo.BeginInvoke(this, e);
}

答案 3 :(得分:0)

这种情况是完全同步的事件。请输入被称为速度的代码。

有可能在获取速度“MovingObject.movement_Y.Speed”时,由于某些异步调用,某些依赖字段会发生变化。