国产探花免费观看_亚洲丰满少妇自慰呻吟_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是包含了本行及以下的所有代碼在新線程中執行,但僅限本方法及本方法調用的方法,不會進入上級方法。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 涿鹿县| 汉寿县| 大竹县| 金阳县| 灵丘县| 海淀区| 大关县| 瑞丽市| 当雄县| 龙门县| 张北县| 红安县| 湛江市| 工布江达县| 弥渡县| 阳春市| 辰溪县| 闽侯县| 呼伦贝尔市| 吉木乃县| 沂水县| 依兰县| 安新县| 讷河市| 长岭县| 普宁市| 得荣县| 南郑县| 陕西省| 遵义县| 绥滨县| 大洼县| 绥中县| 乌兰县| 乌鲁木齐县| 名山县| 壤塘县| 惠水县| 迁安市| 乌兰察布市| 华安县|