剖析.NET 中 yield
和 await
的控制流程
yield
和 await
是基本的 .NET 功能,可實現複雜的控制流和非同步程式設計。 然而,它們的底層機制可能很複雜。
await
:編排並發執行
與執行緒執行相反,await
透過以下步驟巧妙地管理控制流程:
理解延續傳遞風格
await
嚴重依賴「連續傳遞風格」。 當遇到時,會產生一個代表任務完成後程式碼繼續的委託。該代表持有:
維護啟動記錄
.NET 巧妙地將其重新定位到堆,而不是丟棄 await
上的激活記錄(堆疊幀)。這一點至關重要,因為非同步操作並不總是遵循嚴格的基於堆疊的執行模式。
異常處理與堆疊展開
await
的異常處理是細緻入微的。 當檢索任務結果時,將捕獲並重新拋出等待任務中未處理的異常。
yield
及其執行影響
yield
定義迭代器,與 await
有相似之處。在迭代器區塊內,yield
:
yield
點恢復執行。 狀態保護 yield
與await
類似,yield
使用基於堆的活化記錄。 遇到 yield
時,目前狀態(包括下一個 MoveNext
呼叫的指令指標)將會儲存在堆疊上。
進一步探討
徹底理解 lambda 表達式中的閉包類別對於掌握 yield
和 await
的詳細實作至關重要。 許多資源,包括 Eric Lippert 的著作,都提供了對其 .NET 機制的深入解釋。
以上是`yield` 和 `await` 如何控制 .NET 中的非同步程式流程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!