教你正確打開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返回的值: 
        //主線程結束        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM