await 关键字提供了一种非阻塞方式来启动任务,然后在此任务完成时继续执行。
从状态机的角度出发,await
的本质是调用Task.GetAwaiter()
的UnsafeOnCompleted(Action)
回调,并指定下一个状态号。
从多线程的角度出发,如果await
的Task
需要在新的线程上执行,该状态机的MoveNext()
方法会立即返回,此时,主线程被释放出来了,然后在UnsafeOnCompleted
回调的action
指定的线程上下文中继续MoveNext()
和下一个状态的代码。
而相比之下,GetResult()
就是在当前线程上立即等待Task
的完成,在Task
完成前,当前线程不会释放。