Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#_Multithreading_Events - Fatal编程技术网

C# 事件是否同步运行?

C# 事件是否同步运行?,c#,multithreading,events,C#,Multithreading,Events,我即将编写自己的碰撞检测代码。这就是它的工作原理: 我的对象投射移动事件 我的世界/碰撞管理器会侦听所有可移动对象的移动事件,并检查它们是否移动 如果它们移动,我会检查碰撞并解决它们 现在的问题是,在以下代码中,对象的移动速度有时会发生变化: private void OnObjectMove(StaticObject MovingObject) { if(maskCollision(MovingObject)) { Console

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

  • 我的对象投射移动事件
  • 我的世界/碰撞管理器会侦听所有可移动对象的移动事件,并检查它们是否移动
  • 如果它们移动,我会检查碰撞并解决它们
  • 现在的问题是,在以下代码中,对象的移动速度有时会发生变化:

    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
    
    正如你所看到的,我的movementX由于某种原因而改变了

    输出在大多数情况下是相同的,但有时不是,然后我所有的方法都会抛出例外,因为我不希望速度在那里发生变化。现在我对对象速度变化的唯一解释是,事件在一个单独的线程上运行。
    这是真的吗?我怎样才能等待活动?如果可能的话,等待是明智的吗?还是会让我的代码变慢?(我可以从我的movingObject中调用methode。但是它必须拯救世界/collisionmanager-object)

    @Adam Sears是对的,这是你的答案,请参见:

    移动对象。移动速度

    vs

    碰撞物体。移动速度

    你在比较Y和X


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

    @Adam Sears是对的,这是您的答案,请参阅:

    移动对象。移动速度

    vs

    碰撞物体。移动速度

    你在比较Y和X

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

    如中所示,事件是同步的,除非将它们构建为其他方式

    作为一个游戏开发者,对我很有用的,也可能对你很有用的,是一个“脏位”的实现,它告诉我一个对象是否已经改变(位置等),以避免不必要地调用计算昂贵的方法。这允许您连续移动对象,在移动每个对象时测试碰撞。如果遇到性能问题,您可能会发现(或者,在3d系统中)特别有用。

    如中所示,事件是同步的,除非您将其构建为其他方式


    作为一个游戏开发者,对我很有用的,也可能对你很有用的,是一个“脏位”的实现,它告诉我一个对象是否已经改变(位置等),以避免不必要地调用计算昂贵的方法。这允许您连续移动对象,在移动每个对象时测试碰撞。如果遇到性能问题,您可能会发现(或者,在3d系统中)特别有用。

    对于事件是否在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);
    }
    
    异步实现如下所示:

    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);
    }
    

    对于事件是否在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);
    }
    
    异步实现如下所示:

    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);
    }
    

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


    在获取速度“MovingObject.movement\u Y.speed”时,可能会由于某些异步调用而更改某些相关字段。

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



    在获取速度“MovingObject.movement_Y.speed”时,可能会由于某个异步调用而更改某些依赖字段。

    您在第一段代码中调用了错误的变量/属性。如果您看不到@AdamSears的意思,在第一个控制台writeline中,您将对这两个值使用movement_Y.speed。编辑:哎呀,他正在编辑评论以便更清楚。好的,对不起。不知什么原因,我没有看到这一点:我破坏了格式,并尽可能快地编辑了它。抱歉^^您在第一段代码中调用了错误的变量/属性。如果您看不到@AdamSears在说什么,在第一个控制台writeline中,您对这两个值都使用了movement_Y.Speed。编辑:哎呀,他正在编辑评论以便更清楚。好的,对不起。不知什么原因,我没有看到这一点:我破坏了格式,并尽可能快地编辑了它。抱歉^^您的第三个选项决不是异步的。
    async
    实际上是一个谎言。你是对的,删除了第三个选项。编译器甚至警告该方法将同步运行。您的第三个选项决不是异步的。
    async
    实际上是一个谎言。你是对的,删除了第三个选项。编译器甚至警告说该方法将同步运行。谢谢这个有用的答案。但我不完全明白你说的那一点肮脏的话是什么意思。我明白,如果对象发生变化,这将是真实的,但我应该如何在我的情况下利用它?感谢这个有用的答案。但我不完全明白你说的那一点肮脏的话是什么意思。我知道,如果对象发生变化,这将是正确的,但在我的情况下,我应该如何利用它?它只是返回速度变量。没别的了。。。获取{return speed;}设置{speed=value;}谁写入或更改速度变量的值?my palyer会侦听按键关闭事件。如果钥匙按下,速度将降低或升高(或者如果maxim