3 回答

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
由于每個(gè)狀態(tài)機(jī)都保存在內(nèi)存中,這會(huì)不會(huì)導(dǎo)致內(nèi)存消耗大?
不太可能。每個(gè)狀態(tài)機(jī)將在外部占用幾十個(gè)字節(jié)。
所以只有當(dāng)你有很多的時(shí)候才重要。嵌套并不會(huì)真正導(dǎo)致這種情況,而是執(zhí)行Task[]
可能的成員。
但這并不是任何其他資源類型的新內(nèi)容或不同之處。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
異步/等待 POV - 對(duì)于每個(gè) await ,都有一個(gè)狀態(tài)機(jī)被保留。
不對(duì)。編譯器為每個(gè)async
方法生成一個(gè)狀態(tài)機(jī)。方法中的局部變量被提升到狀態(tài)機(jī)上的字段中。方法的主體(基本上)被分解為一個(gè)switch
語(yǔ)句,每個(gè)語(yǔ)句case
對(duì)應(yīng)于await
語(yǔ)句之間的方法的一部分。Anint
用于跟蹤方法的哪一部分已被執(zhí)行(即case
接下來(lái)應(yīng)該執(zhí)行哪一部分)。
您的方法a()
、b()
等可能有自己的狀態(tài)機(jī),也可能沒(méi)有(取決于它們是否被標(biāo)記async
)。即使他們這樣做,在您的示例中,一次也只會(huì)實(shí)例化其中一個(gè)狀態(tài)機(jī)。
SharpLab 是探索這些內(nèi)容的絕佳資源。例子。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
有一個(gè)額外的成本,但它是相對(duì)苗條的。
與常規(guī)功能相比的額外費(fèi)用:
狀態(tài)機(jī)類
這個(gè)類的實(shí)例
一個(gè) int 用于執(zhí)行階段
AsyncTaskMethodBuilder 實(shí)例
此外,函數(shù)的局部變量將被轉(zhuǎn)換為狀態(tài)機(jī)的字段。這會(huì)將一些內(nèi)存從堆棧移動(dòng)到堆。
我建議反編譯一些簡(jiǎn)單的異步函數(shù),以查看生成的狀態(tài)機(jī)并有一個(gè)直覺(jué)會(huì)發(fā)生什么。
也有一些在線工具可以做到這一點(diǎn)(比如 sharplab.io)查看一個(gè)簡(jiǎn)單的異步函數(shù)的反編譯結(jié)果
- 3 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報(bào)