首页 >后端开发 >C++ >.NET 中 `yield` 和 `await` 如何实现流量控制?

.NET 中 `yield` 和 `await` 如何实现流量控制?

Patricia Arquette
Patricia Arquette原创
2025-01-14 11:16:43789浏览

How Do `yield` and `await` Implement Flow Control in .NET?

.NET 流控制:深入探讨 yieldawait

yieldawait 是基本的 .NET 关键字,可实现复杂的控制流、模拟并发。 然而,了解其潜在机制需要仔细检查。本文阐明了它们的功能。

await的控制流机制

遇到 await 会触发以下运行时操作:

  • 对于未完成的任务,await 附加一个继续委托,稍后恢复执行。
  • 控制权返回给调用者,从而实现并行执行。
  • 任务完成后,继续执行,从暂停点恢复该方法。

管理连续数据

await生成的延续委托包括:

  • 指令指针(下一条指令)。
  • 局部变量和临时值。

此数据驻留在堆上,即使在典型的堆栈激活序列之外也确保可访问性。

调用堆栈保存

与标准调用堆栈不同,关键的激活记录信息最初是在堆上分配的。不会存储呼叫者激活记录,因为它们是在 await.

之后访问的

yield 和迭代器状态管理

yield,在迭代器块内,功能与 await 类似。 遇到 yield 时,本地状态将连同下一个 MoveNext 执行的指令指针一起移至堆中。 异常处理集成在迭代器块的内部管理中。

异常处理策略

未捕获的异常在任务中被捕获,并在访问任务结果时重新抛出。

总结

yieldawait 的复杂性源于它们对连续传递风格 (CPS) 的依赖。 运行时策略性地将激活信息卸载到堆,保留控制流和迭代器状态。虽然理解 await 的 lambda 表达式至关重要,但进一步探索 CPS(如 Eric Lippert 关于 yield、迭代器和异步编程的博客文章中详细介绍的那样)可以提供更深入的理解。

以上是.NET 中 `yield` 和 `await` 如何实现流量控制?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn