.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中文网其他相关文章!