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