不同线程中的异步方法延续 - 意味着对对象变量的协作双线程访问?

时间:2016-10-30 20:43:23

标签: c# multithreading asynchronous synchronization async-await

当我用异步方法编写时:

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以防止意外死锁)。

1 个答案:

答案 0 :(得分:2)

  

(我不确定有多少线程可以使用Monogame绘制线程同步上下文,因此我将ConfigureAwait设置为false以防止意外死锁)。

我认为这是误解。如果绘制线程有自己的专用于该线程的同步上下文,那么如果使用普通await,它将在该绘制线程上恢复。在我看来,你想要

ConfigureAwait(false)的原因是 以防止意外死锁"。只是通知await不关心您需要恢复的上下文。因此,如果您关注您继续使用的上下文,那么当然您不应使用ConfigureAwait(false)

async intro博文中的更多信息。