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