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

本文关键字:线程 两个 对象 访问 协作 变量 意味着 延续 异步方法 | 更新日期: 2023-09-27 18:15:38

当我写async方法时:

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)?(我不确定有多少线程可以有一夫一妻制绘制线程同步上下文,所以我设置ConfigureAwait为false,以防止意外死锁)。

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

(我不确定有多少线程可以有一夫一妻制绘制线程同步上下文,所以我设置ConfigureAwait为false以防止意外死锁)。

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

ConfigureAwait(false)的原因是不是是为了"防止意外死锁"。这只是为了通知await,你不关心你需要恢复的上下文。因此,如果您确实关心在什么上下文中恢复,那么您当然不应该使用ConfigureAwait(false)

更多信息在我的async介绍博客文章