国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

小結:Async&Await

2019-11-14 16:03:41
字體:
來源:轉載
供稿:網友

新項目組用到Async & Await, 關于Await會不會新開不開線程,遇到什么情況會新開線程的問題網上查了很多資料都沒看到直觀的解釋。現簡單總結一下。

直接上代碼:

 

namespace Consoleapplication2{    class PRogram    {        static void Main(string[] args)        {            Test();             Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId);            Console.ReadKey();        }        static async Task Test()        {            await Task.Run(new Action(GetName));   //Await 在這里必須搭配Task的新開線程方法使用,并且表示從這一行開始的剩余code在新線程中執行,并告訴Main線程繼續往下執行。            Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId);                               }        public static void GetName()        {            for(int i=0; i<1000000000;i++)            {                int a = 15*15*15*15*15*15;            }                          Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId);        }       }}

  

結果如下

Current Thread Id1 :9  

Current Thread Id3 :10

Current Thread Id2 :10

 

 

為了驗證await是不是遇到新開啟線程的方法才會觸發他的作用,做如下更改。

namespace ConsoleApplication2{    class Program    {        static void Main(string[] args)        {            Test();             Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId);            Console.ReadKey();        }        static async Task Test()        {            await GetName();            Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId);                               }        public static async Task GetName()        {            for(int i=0; i<1000000000;i++)            {                int a = 15*15*15*15*15*15;            }             await Task.Delay(10000);             Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId);        }       }}

  

發現Main線程會等待GetName里的復雜運算結束后,知道Task.Delay才會繼續執行Main線程,猜測正確。

 

 

補充一句,在第一段code中,如果在Test方法中的 await Task.Run(new Action(GetName));  沒有await, 代碼跑到這里開啟線程的同時Main線程會繼續往下之前,因此await是包含了本行及以下的所有代碼在新線程中執行,但僅限本方法及本方法調用的方法,不會進入上級方法。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 原阳县| 太仆寺旗| 汉川市| 同江市| 峡江县| 甘孜县| 文登市| 塔河县| 虎林市| 建德市| 景德镇市| 孟村| 桦川县| 长子县| 兴化市| 邯郸县| 临西县| 巨鹿县| 定结县| 汉中市| 马山县| 紫金县| 桑植县| 福建省| 临安市| 凤冈县| 额济纳旗| 板桥市| 邵东县| 赞皇县| 麻城市| 马龙县| 延吉市| 巫溪县| 漾濞| 吴堡县| 横峰县| 登封市| 合肥市| 介休市| 姚安县|