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

时间:2017-08-21 07:58:50

标签: c# .net asynchronous async-await

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

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

例如,请考虑以下代码:

int Foo() {
    int y = ReadSomethingFromConsole();
    int x = await DoSomethingAsync();
    return x+y; 
}

调用堆栈如下所示:

EventLoop(...);
.......
Foo();

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

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

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

修改await如何创建新的堆叠框架?是否复制了一些“模板”堆栈帧快照,类似于VM快照?

0 个答案:

没有答案