当我用异步方法编写时:
public class myGameLoop
{
protected class GameObject
{
....
}
protected GameObject [] myGameObjects;
public async Task myMethod()
{
myPrologue(); //runs on caller thread 1
await SomeLongOperation().ConfigureAwait(false); //runs on thread 2
myContinuation(); //maybe on thread 2 or another one from pool
}
}
有可能不在与myPrologue()相同的线程中执行myContinuation()。想象一下,调用者线程是游戏的抽奖线程。然后,如果myPrologue()更改了myGameObjects数组中的非原子对象,并且myContinuation()也可以使用它们,则我们无法从2个线程对对象/数组进行非同步访问,这可能会破坏它们。
是真的还是async / await在这种情况下有一些同步的东西?还是我应该避免使用ConfigureAwait(false)?(我不确定Monogame绘制线程同步上下文可以包含多少个线程,因此我将ConfigureAwait设置为false以防止意外死锁)。
(我不确定Monogame绘制线程同步上下文可以包含多少个线程,因此我将ConfigureAwait设置为false以防止意外死锁)。
我认为这是误解。如果绘图线程具有专用于该线程的自己的同步上下文,则如果使用plain await
,它将在该绘图线程上继续。在我看来,这就是您想要的。
其原因ConfigureAwait(false)
是不以“防止意外死锁”。只是通知await
您,您不在乎需要恢复的上下文。因此,如果您确实在乎要恢复的上下文,那么您当然不应该使用ConfigureAwait(false)
。
有关更多信息,请参见我的async
简介博客文章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句