簡體   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