3 回答
TA貢獻2016條經驗 獲得超9個贊
由于每個狀態機都保存在內存中,這會不會導致內存消耗大?
不太可能。每個狀態機將在外部占用幾十個字節。
所以只有當你有很多的時候才重要。嵌套并不會真正導致這種情況,而是執行Task[]可能的成員。
但這并不是任何其他資源類型的新內容或不同之處。
TA貢獻1827條經驗 獲得超4個贊
異步/等待 POV - 對于每個 await ,都有一個狀態機被保留。
不對。編譯器為每個async方法生成一個狀態機。方法中的局部變量被提升到狀態機上的字段中。方法的主體(基本上)被分解為一個switch語句,每個語句case對應于await語句之間的方法的一部分。Anint用于跟蹤方法的哪一部分已被執行(即case接下來應該執行哪一部分)。
您的方法a()、b()等可能有自己的狀態機,也可能沒有(取決于它們是否被標記async)。即使他們這樣做,在您的示例中,一次也只會實例化其中一個狀態機。
SharpLab 是探索這些內容的絕佳資源。例子。
TA貢獻1828條經驗 獲得超3個贊
有一個額外的成本,但它是相對苗條的。
與常規功能相比的額外費用:
狀態機類
這個類的實例
一個 int 用于執行階段
AsyncTaskMethodBuilder 實例
此外,函數的局部變量將被轉換為狀態機的字段。這會將一些內存從堆棧移動到堆。
我建議反編譯一些簡單的異步函數,以查看生成的狀態機并有一個直覺會發生什么。
也有一些在線工具可以做到這一點(比如 sharplab.io)查看一個簡單的異步函數的反編譯結果
- 3 回答
- 0 關注
- 161 瀏覽
添加回答
舉報
