.NET 流控制:深入探討 yield
和 await
yield
和 await
是基本的 .NET 關鍵字,可實現複雜的控制流、模擬並發。 然而,了解其潛在機制需要仔細檢查。本文闡明了它們的功能。
await
的控制流機制
遇到 await
會觸發以下運行時操作:
await
附加一個繼續委託,稍後再恢復執行。 管理連續資料
await
產生的延續委託包括:
此資料駐留在堆上,即使在典型的堆疊啟動序列之外也確保可存取性。
呼叫堆疊保存
與標準呼叫堆疊不同,關鍵的啟動記錄資訊最初是在堆上分配的。不會儲存呼叫者啟動記錄,因為它們是在 await
.
yield
和迭代器狀態管理
yield
,在迭代器區塊內,功能與 await
類似。 遇到 yield
時,本地狀態將連同下一個 MoveNext
執行的指令指標一起移至堆中。 異常處理整合在迭代器區塊的內部管理中。
異常處理策略
未捕獲的異常在任務中被捕獲,並在存取任務結果時重新拋出。
總結
yield
和 await
的複雜性源自於它們對連續傳遞風格 (CPS) 的依賴。 運行時策略性地將啟動資訊卸載到堆,保留控制流和迭代器狀態。雖然理解 await
的 lambda 表達式至關重要,但進一步探索 CPS(如 Eric Lippert 關於 yield
、迭代器和非同步程式設計的部落格文章中詳細介紹的那樣)可以提供更深入的理解。
以上是.NET 中 `yield` 和 `await` 如何實現流量控制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!