page contents

请简述 await的作用和原理,并说明和 GetResult()有什么区别

轩辕小不懂 发布于 2021-09-08 14:29
阅读 494
收藏 0
分类:面试与就业
1882
Nen
Nen
- 程序员

从状态机的角度出发, await的本质是调用 Task.GetAwaiter()的 UnsafeOnCompleted(Action)回调,并指定下一个状态号。

从多线程的角度出发,如果 await的 Task需要在新的线程上执行,该状态机的 MoveNext()方法会立即返回,此时,主线程被释放出来了,然后在 UnsafeOnCompleted回调的 action指定的线程上下文中继续 MoveNext()和下一个状态的代码。

而相比之下, GetResult()就是在当前线程上立即等待 Task的完成,在 Task完成前,当前线程不会释放。

注意: Task也可能不一定在新的线程上执行,此时用 GetResult()或者 await就只有会不会创建状态机的区别了。

请先 登录 后评论