C# 关于异步等待async/await的学习理解

C# 提供了Task来实现异步操作,Task.Run可以很方便的启动一个线程执行异步任务

异步操作能提高效率,但是不便于控制,假如我们要获得异步任务的执行结果,如果采用回调的方式,传值就比较麻烦

当然也可以直接调用Task.Result以同步的方式等待异步任务执行完毕后获得结果再行处理,但是这样就会导致当前线程被阻塞,浪费性能,让人很不爽

而async/await就能避免这个问题,当我们在一个函数中使用await的时候,代码执行到这里就会停下来等待异步函数执行完毕,但是此时当前线程却不是阻塞的,因为await本质上是一个可轮询状态机,等异步任务执行完毕后,就会调用线程(应该是新的线程吧)执行之前暂停的代码,从感官上来说能以同步的形式来处理异步函数,从性能上来说,避免了当前线程的阻塞一定程度上提高了性能

仅个人理解,不知道有没有错误的地方,如有望指出,共同进步

        static void Test() {
            Console.WriteLine("Test start...");
            AAA(); //同步执行,阻塞线程
            BBB(); //这里为了终止async/await的传染,没有等待,所以直接过去,不是异步等待
            Console.WriteLine("Test end");
        }
        static void AAA() {
            var task = Task.Run(() => {
                Console.WriteLine("task执行");
                Thread.Sleep(3000);
                return 123;
            });
            task.Wait(); //同步等待,会阻塞线程,直到异步函数执行完毕
            //task.Result; //获取返回值的方式
            Console.WriteLine("task执行等待完成");
        }
        /// <summary>
        /// 非async修饰的函数可以直接调用BBB,整体上是个异步函数
        /// 如果外部还是需要等待,就不能void,需要至少返回Task,调用的时候继续await
        /// </summary>
        static async void BBB() {
            var task = Task.Run(() => {
                Console.WriteLine("task执行");
                Thread.Sleep(3000);
                return 123;
            });
            int result = await task; //异步等待,await本质上是一个可轮询状态机,不会阻塞线程
            //等task异步函数执行完毕后会再切到这里继续执行代码
            Console.WriteLine("task执行等待完成,result=" + result);
        }

  

posted @ 2021-10-27 10:44  WmW  阅读(1277)  评论(0编辑  收藏  举报