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

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

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

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

await不会阻塞调用它的线程,而GetAwaiter().GetResult()和.Result则会阻塞调用它的线程,但都会阻塞当前线程。

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

GetResult() 使用案例

Task.Run(()=>
            {
                Thread.Sleep(1000);
                Console.WriteLine(1111);
            }).GetAwaiter().GetResult();//会阻塞调用它的线程