教你正確打開async/await關鍵字的使用

  這段時間在項目開發中看到了一些async/await的使用,在aspnet core的host組件源碼中也看到了許多的async/await代碼。在開發時,正確的使用了async/await是能夠提升程序的性能。下面的代碼教你正確的理解await關鍵字的暫停/阻塞方法調用:async

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方法調用結束");spa

 
 

      // var str1 = GetStringOne();
      // Console.WriteLine("GetStringOne方法調用結束");線程

 
 

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

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關鍵字會阻塞/暫停它所在的方法。根據結果便可判斷:blog

        //主線程啓動
        //GetStrLengthAsync方法開始執行
        //GetString方法開始執行
        //主線程繼續執行
        //GetString方法調用結束
        //GetStringOne方法開始執行
        //GetStringOne方法調用結束
        //GetStrLengthAsync方法執行結束
        //Task返回的值: 
        //主線程結束



        //主線程啓動
        //GetStrLengthAsync方法開始執行
        //GetString方法開始執行
        //GetString方法調用結束
        //GetStringOne方法開始執行
        //GetStringOne方法調用結束
        //GetStrLengthAsync方法執行結束
        //主線程繼續執行
        //Task返回的值: 
        //主線程結束        
相關文章
相關標籤/搜索