亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

長異步等待鏈會導致大量內存消耗嗎?(理論上)

長異步等待鏈會導致大量內存消耗嗎?(理論上)

C#
人到中年有點甜 2022-12-24 10:37:29
查看這段代碼:public async Task<T> ConsumeAsync()    {          await a();          await b();          await c();          await d();          //..    }假設a,b,c,d還有嵌套的異步等待(等等)異步/等待 POV - 對于每個await,都有一個狀態機被保留。問題(理論):由于每個狀態機都保存在內存中,這是否會導致內存消耗大?這可能是一個模糊的問題,但如果有很多狀態,似乎不可避免地不會懷疑所保留的狀態機的大小。
查看完整描述

3 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

由于每個狀態機都保存在內存中,這會不會導致內存消耗大?

不太可能。每個狀態機將在外部占用幾十個字節。

所以只有當你有很多的時候才重要。嵌套并不會真正導致這種情況,而是執行Task[]可能的成員。

但這并不是任何其他資源類型的新內容或不同之處。


查看完整回答
反對 回復 2022-12-24
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

異步/等待 POV - 對于每個 await ,都有一個狀態機被保留。

不對。編譯器為每個async方法生成一個狀態機。方法中的局部變量被提升到狀態機上的字段中。方法的主體(基本上)被分解為一個switch語句,每個語句case對應于await語句之間的方法的一部分。Anint用于跟蹤方法的哪一部分已被執行(即case接下來應該執行哪一部分)。

您的方法a()、b()等可能有自己的狀態機,也可能沒有(取決于它們是否被標記async)。即使他們這樣做,在您的示例中,一次也只會實例化其中一個狀態機。

SharpLab 是探索這些內容的絕佳資源。例子。


查看完整回答
反對 回復 2022-12-24
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

有一個額外的成本,但它是相對苗條的。

與常規功能相比的額外費用:

  • 狀態機類

  • 這個類的實例

  • 一個 int 用于執行階段

  • AsyncTaskMethodBuilder 實例

此外,函數的局部變量將被轉換為狀態機的字段。這會將一些內存從堆棧移動到堆。

我建議反編譯一些簡單的異步函數,以查看生成的狀態機并有一個直覺會發生什么。

也有一些在線工具可以做到這一點(比如 sharplab.io)查看一個簡單的異步函數的反編譯結果


查看完整回答
反對 回復 2022-12-24
  • 3 回答
  • 0 關注
  • 161 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號