• 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);
            }
    

      

  • 相关阅读:
    elasticsearch设置共享目录、创建备份、恢复备份
    elasticsearch通过logstash去重数据
    Densite_RANK 函数
    Echarts立体地图加3D柱图可点击可高亮选中的开发
    Hadoop3.x-Yarn
    Hadoop3.x-MapReduce
    python dvwa时间盲注自动化脚本(level=low)
    python dvwa布尔盲注自动化脚本(level=low)
    时序数据库 Apache-IoTDB 源码解析之元数据索引块(六)
    网易2020校招笔试- 系统开发/研发工程师(提前批) [编程题]序列维护
  • 原文地址:https://www.cnblogs.com/luludongxu/p/15469454.html
Copyright © 2020-2023  润新知