<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C#中關于Task.Yeild()的探究

            在與同事討論async/await內部實現的時候,突然想到Task.Yeild()這個函數,為什么呢,了解一點C#async/await內部機制的都知道,在await一個異步任務(函數)的時候,它會先判斷該Task是否已經完成,如果已經完成,則繼續執行下去,不會返回到調用方,原因是盡量避免線程切換,因為await后面部分的代碼很可能是另一個不同的線程執行,而Task.Yeild()則可以強制回到調用方,或者說主動讓出執行權,給其他Task執行的機會,可以把Task理解為協程,Task.Yeild()和Thread.sleep(0)有點相同。

            為了證明我的結論成立,請看代碼:

       1 public static async Task Test1()
       2 {
       3      await Task.CompletedTask;
       4      Thread.Sleep(1000);
       5      Console.WriteLine("Test1任務完成");
       6 }
       7 public static async Task Test2()
       8 {
       9      await Task.Delay(1);
      10      Thread.Sleep(1000);
      11      Console.WriteLine("Test2任務完成");
      12 }
      13 public static async Task Test3()
      14 {
      15      await Task.Yield();
      16      Thread.Sleep(1000);
      17      Console.WriteLine("Test3任務完成");
      18 }
      19 static void Main(string[] args)
      20 {
      21      Console.WriteLine(DateTime.Now);
      22      _ = Test1();
      23      Console.WriteLine(DateTime.Now);
      24      Console.ReadLine();
      25 }

       

            按照開頭的理論,Test1()異步函數由于await了一個已經完成的任務,所以會繼續往下執行,阻塞1秒鐘,然后回到調用方,打印的時間之差會相隔一秒。

      image_thumb1_thumb

            Test2()異步函數由于await了一個未完成的任務(1ms對于CPU來說是很長的了),所以會返回調用方,然后打印相同的時間,一秒鐘之后會打印執行完畢。

      image_thumb3_thumb

            Test3()調用了Task.Yeild()函數,主動讓出執行權,所以會直接返回調用方,然后打印相同的時間,一秒之后會打印執行完畢。

      image_thumb5_thumb

            可以看到,開頭的結論是正確的。那么,有什么意義呢?Yeild的意思在這里其實就是退讓,讓出的意思,讓出什么呢?就是讓出執行權,這與Thread.sleep(0)讓出CPU執行權給其他線程(前提是有其他線程競爭)有機會執行是一個道理。

            請看我的例子:

       1 public static async Task OP1()
       2 {
       3      while (true)
       4      {
       5          await Task.Yield();//這里會捕捉同步上下文,由于是控制臺程序,沒有同步上下文,所以默認的線程池任務調度器變成同步上下文
       6                                      //也就是說后面的代碼將會在線程池上執行,由于線程池工作線程數量設置為1,所以必須主動讓出執行權,讓其他的
       7                                      //任務有執行的機會
       8          Console.WriteLine("OP1在執行");
       9          Thread.Sleep(1000);//模擬一些需要占用CPU的操作
      10      }
      11 }
      12 public static async Task OP2()
      13 {
      14      while (true)
      15      {
      16          await Task.Yield();
      17          Console.WriteLine("OP2在執行");
      18          Thread.Sleep(1000);
      19      }
      20 }
      21 static async Task Main(string[] args)
      22 {
      23      ThreadPool.SetMinThreads(1, 1);
      24      ThreadPool.SetMaxThreads(1, 1);
      25      //Task.Run()方法默認使用線程池任務調度器執行任務,由于主線程不是線程池線程,所以使用Task.Run()
      26      var t = Task.Run(async () => 
      27      {
      28          var t1 = OP1();
      29          var t2 = OP2();
      30          await Task.WhenAll(t1, t2);
      31      });
      32      await t;
      33      Console.ReadLine();
      34 }

       

      image_thumb9_thumb

            可以看出OP1()和OP2()兩個協程(Task)互相爭用一個線程(用戶模式下的CPU),如果不主動讓出執行權,另一個協程(Task)將不會有機會執行。

            例如:

      1 public static async Task OP2()
      2 {
      3      while (true)
      4      {
      5          await Task.CompletedTask;//或者是直接去掉
      6          Console.WriteLine($"OP2在執行 {DateTime.Now}");
      7          Thread.Sleep(1000);
      8      }
      9 }

       

            這樣OP1()將永遠不會有機會執行。

      image20_thumb_thumb

      posted @ 2020-07-09 21:45  白煙染黑墨  閱讀(1049)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品va无码一区二区| 久久人人97超碰人人澡爱香蕉| 从江县| 久久久久四虎精品免费入口 | 成人午夜福利一区二区四区| 免费人成网上在线观看网址| 国产偷窥熟女高潮精品视频| 国产一区二区三区十八禁| 亚洲一品道一区二区三区| av无码精品一区二区乱子 | 在线观看国产成人av片| 亚洲精品人妻中文字幕| 亚洲精品岛国片在线观看| 一二三三免费观看视频| 亚洲成在人天堂一区二区| 综合偷自拍亚洲乱中文字幕| 亚洲av无码精品蜜桃| 亚洲国产中文字幕在线视频综合| 狠狠做五月深爱婷婷伊人| 国产熟妇久久777777| 国产精品久久人妻无码网站一区| 国偷自产一区二区三区在线视频| 久久a级片| 久久人妻国产精品| 国产精品先锋资源在线看| 成人网站免费观看永久视频下载| 综合色一色综合久久网| 亚洲精品中文字幕在线观| 亚洲鸥美日韩精品久久| 成人无码区在线观看| 久久夜色精品久久噜噜亚| 在线a人片免费观看| 亚洲欧美日本久久网站| 亚洲偷自拍另类一区二区| 蜜芽久久人人超碰爱香蕉| 人妻体内射精一区二区三四| 午夜福利国产片在线视频| 毛葺葺老太做受视频| 国产精品国产三级国产午| 极品少妇无套内射视频| 强奷白丝美女在线观看|