unity coroutine与C# async


coroutine以yield为界,把函数分成多段,构成一个状态机对象。
async以await为界,把函数分成多段,构成一个状态机对象。

状态机对象是指它可以多次执行,并且会依次执行函数的每一段。首次执行后的每一次执行可以称为"重入状态机"。

coroutine就像是数组,async就像是链表。
它们的项的形式是相似,都是两个可等待对象之间的同步代码,以及其后的一个可等待对象。

coroutine的可等待对象可能需要调度器去更新状态才能达到完成状态。
async await不关心可等待对象如何更新,如何完成。

coroutine由外部调度器检查当前等待对象是否完成,并以此决定是否重入状态机。
async的项是首尾相连的,前一项完成会内部自行重入状态机

coroutine是基于IEnumrator的yield状态机语法糖,unity自己做的调度
async和await本身是状态机的语法糖,但是还包含GetAwaitor()这样一个约定。这个不是强类型约束的,而是有这样的方法就行。

从语法糖的代码生成量来说,yield做的事情比async await少。因此coroutine的一部分逻辑在调度器上,而async的逻辑基本在它本身的生成代码里(它把awaitor之间连接了起来)。

相关