异步/等待转换过程是否有规定?

7
在C#中,将LINQ查询语法转换为实际执行的代码的过程在语言规范的第7.16节中详细描述,这使得语言开发人员可以轻松地将其用于在新CLR语言上实现类似的查询语法。 是否有类似详细规范适用于在C# 5版本中添加的async/await语法?Eric Lippert在该主题上的一篇博客文章展示了在特定场景下转换的变化前后视图,但实际上并未透露有用程度的底层规则。此规范是否存在? 编辑:我可以看到C#语言规范中有一节关于await表达式和异步函数的内容。尽管它没有像LINQ那样深入到同样的细节级别,但基本上我正在寻找一个过程描述,以便“按照这些步骤将Eric帖子顶部的代码转换为帖子底部的状态机”,这样语言设计人员就可以在不同的CLR语言中实现该功能,并最终具有相同的语义。

3
好的,这段话的意思是:“嗯……它在规范的第7.7.7节和第10.15节中有所描述(特别是第7.7.7.3节)。”。 - Lucas Trzesniewski
1
@LucasTrzesniewski:是的,我看过那个,但那里的规范远不如LINQ转换的描述详细。 - Mason Wheeler
更明显的转换是迭代器块/yield(实际上,它们重用了许多这些移动部件),这些看起来也没有明确指定的机制。 - Damien_The_Unbeliever
1个回答

1

这似乎是一项实现细节,因为它往往会更改。例如,c#6将在catch/finally子句中引入await(通常的想法描述在这里)。

然而,在c#5中实现awaiters的深度细节有一些。查看链接,特别是Async Codegen(ppt)。

这样,语言设计者可以在不同的CLR语言中实现该功能,并最终具有相同的语义

我建议您看一下 AsyncRewriter code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,