繁体   English   中英

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

[英]Async method continuation in different thread - means cooperative two-thread access to object variable?

当我用异步方法编写时:

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

我认为这是误解。 如果绘图线程具有自己的专用于该线程的同步上下文,则如果使用普通的await ,它将在该绘图线程上继续。 在我看来,这就是您想要的

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

有关更多信息,请参见我的async介绍博客文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM