async-await如何在引擎盖下工作?

sas*_*alm 6 .net c# asynchronous async-await

我最近讨论了async-await如何工作,我想知道我是否正确.

async-await是否通过将线程的ESP堆栈指针切换为指向不同的堆栈帧来工作?这类似于WINAPI光纤或旧的Win3.1协作式多任务处理.

例如,考虑以下代码:

int Foo() {
    int y = ReadSomethingFromConsole();
    int x = await DoSomethingAsync();
    return x+y; 
}
Run Code Online (Sandbox Code Playgroud)

调用堆栈看起来像这样:

EventLoop(...);
.......
Foo();
Run Code Online (Sandbox Code Playgroud)

在我们到达该await语句时,计划在线程池中运行一个新任务,并await立即将ESP指针切换为指向我们所在EventLoop()函数的新堆栈帧.不会丢弃当前堆栈帧的内存段,只是ESP不再指向它.

然后事件循环运行更多事件,直到通知任务完成.此时,ESP切换到指向Foo()功能的堆栈段.

我是否理解正确,这是如何工作的?

编辑:新的堆栈框架是如何创建的await?是否复制了一些"模板"堆栈帧快照,类似于VM快照?