当我用异步方法编写时:
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
}
}
myContinuation()可能不会在与myPrologue()相同的线程中执行。 想象一下,调用者线程是游戏的绘制线程。然后,如果myPrologue()从myGameObjects数组更改非原子对象,myContinuation()也可以使用它们,我们就有从2个线程到对象/数组的不同步访问,这可能会破坏它们。
这是真的还是async / await对于这种情况有一些同步的东西? 或者我应该避免使用ConfigureAwait(false)? (我不确定有多少线程可以使用Monogame绘制线程同步上下文,因此我将ConfigureAwait设置为false以防止意外死锁)。
答案 0 :(得分:2)
(我不确定有多少线程可以使用Monogame绘制线程同步上下文,因此我将ConfigureAwait设置为false以防止意外死锁)。
我认为这是误解。如果绘制线程有自己的专用于该线程的同步上下文,那么如果使用普通await
,它将在该绘制线程上恢复。在我看来,你想要。
ConfigureAwait(false)
的原因是 以防止意外死锁"。只是通知await
您不关心您需要恢复的上下文。因此,如果您关注您继续使用的上下文,那么当然您不应使用ConfigureAwait(false)
。
我async
intro博文中的更多信息。