GetAwaiter和GetResult(2)

namespace ConsoleApp1
{
    class Program
    {
        /// 示范 GetAwaiter()
        /// tip: 关键字: wait系列, await, result, getResult 要等, 其他都不用        
        static void Main(string[] args)
        {
            var task = RunAsync_1();
            //OnCompleted:对象停止等待 ,异步任务完成去执行下面。。。的task.Result。
            task.GetAwaiter().OnCompleted(() =>
            {
                Console.WriteLine("。。。。。。"+task.Result);
            });

            //这个task.GetAwaiter().GetResult()等价于上面OnCompleted+task.Wait()
            //task.Wait()这个标志是要等到异步程序执行完再去执行其他的
            //Console.WriteLine(task.GetAwaiter().GetResult());

            task.Wait(); //要等
            Console.WriteLine("a-我会先跑");//这里有两个a和b, 当代码从上面走到这两行的时候直接运行,但是呢,这两行下面是task.Wait().就是要等待了。
            Console.WriteLine("b我会先跑");//
            //task.Wait(); //要等
            Console.WriteLine("1-我会先跑");
            //task.Wait(); //要等  Wait():等待系统线程化任务完成执行的任务,这个就是要等待异步线程走完结束,才会继续下去

            Console.WriteLine("上面RunAsync_1执行完了。。。。。。。。");
            var result = RunAsync_2().GetAwaiter().GetResult();  //要等  这个GetResult本身就是要等待异步执行完毕,再会去执行其他的东西
            Console.WriteLine(result);
            Console.WriteLine("4-这次不会先跑了");
            Console.Read();
        }

        static async Task<string> RunAsync_1()
        {
            await Task.Delay(10000);  //要等
            return "2-处理数据需要一些时间";
        }

        static async Task<string> RunAsync_2()
        {
            await Task.Delay(1000);  //要等
            return "3-处理数据需要一些时间";
        }
    }
}
原文地址:https://www.cnblogs.com/ZkbFighting/p/13470024.html