zoukankan      html  css  js  c++  java
  • 教你正确打开async/await关键字的使用

      这段时间在项目开发中看到了一些async/await的使用,在aspnet core的host组件源码中也看到了许多的async/await代码。在开发时,正确的使用了async/await是可以提高程序的性能。下面的代码教你正确的理解await关键字的暂停/阻塞方法调用:

    static void Main(string[] args)
            {
                Console.WriteLine("-------主线程启动-------");
                var task = GetStrLengthAsync();
                Console.WriteLine("主线程继续执行");
                Console.WriteLine("Task返回的值: " + task.Result);
                Console.WriteLine("-------主线程结束-------");
    
                Console.Read();
            }
    
            static async Task<string> GetStrLengthAsync()
            {
                Console.WriteLine("GetStrLengthAsync方法开始执行");
    
                var str = await GetString();
                Console.WriteLine("GetString方法调用结束");
    
                var str1 =await GetStringOne();
                Console.WriteLine("GetStringOne方法调用结束");
    
                Console.WriteLine("GetStrLengthAsync方法执行结束");
                return str + "   ######   " + str1;
            }

         ///await关键字会暂停/阻塞其所在的方法,返回调用 await关键字所在的方法继续执行,而不是接着await关键字所在的代码处往下执行,注释下面的代码,查看运行结果即可确认。

          //static async Task<string> GetStrLengthAsync()
          //{
          // Console.WriteLine("GetStrLengthAsync方法开始执行");

    
    

          // var str = GetString();
          // Console.WriteLine("GetString方法调用结束");

    
    

          // var str1 = GetStringOne();
          // Console.WriteLine("GetStringOne方法调用结束");

    
    

          // Console.WriteLine("GetStrLengthAsync方法执行结束");
          // return await str + " ###### " + await str1;
          //}

    static async Task<string> GetString()
            {
                Console.WriteLine("GetString方法开始执行");
                return await Task.Run(() =>
                {
                    Thread.Sleep(2000);
                    return "GetString的返回值";
                });
            }
    
            static async Task<string> GetStringOne()
            {
                Console.WriteLine("GetStringOne方法开始执行");
                return await Task.Run(() =>
                {
                    Thread.Sleep(2000);
                    return "GetStringOne的返回值";
                });
            }

    await关键字会阻塞/暂停它所在的方法。根据结果即可判断:

            //主线程启动
            //GetStrLengthAsync方法开始执行
            //GetString方法开始执行
            //主线程继续执行
            //GetString方法调用结束
            //GetStringOne方法开始执行
            //GetStringOne方法调用结束
            //GetStrLengthAsync方法执行结束
            //Task返回的值: 
            //主线程结束
    
    
    
            //主线程启动
            //GetStrLengthAsync方法开始执行
            //GetString方法开始执行
            //GetString方法调用结束
            //GetStringOne方法开始执行
            //GetStringOne方法调用结束
            //GetStrLengthAsync方法执行结束
            //主线程继续执行
            //Task返回的值: 
            //主线程结束        
  • 相关阅读:
    Linux下管道编程
    【Windows】用信号量实现生产者-消费者模型
    初识【Windows API】--文本去重
    HDU 5183 Negative and Positive (NP) --Hashmap
    【ASC 23】G. ACdream 1429 Rectangular Polygon --DP
    UVALive 4670 Dominating Patterns --AC自动机第一题
    POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心
    我也来写2014年总结
    UVALive 4870 Roller Coaster --01背包
    UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/9862137.html
Copyright © 2011-2022 走看看