亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

對[yield]的淺究到發現[async][await]

2019-11-17 03:06:36
字體:
來源:轉載
供稿:網友

對[yield]的淺究到發現[async][await]

  上篇對[foreach]的淺究到發現[yield]寫完后,覺得對[yield]還沒有理解清楚,想起曾經看過一位大牛的帖子講的很深刻(鏈接在此),回顧了下,在這里寫出自己的理解,與各位分享。

一、通常的異步

  現在我們假設一種平時經常遇到的情況,現有三個方法,其中funcOne和funcTwo比較耗時需要異步執行,而且他們的邏輯是必須在funcOne執行完后才可以執行funcTwo,同理funcTwo執行完后才能執行funcThree。

  按照這樣的設定,通常的做法請看代碼段[1]:

 1      public class PRogram 2      { 3          public delegate void CallBack(string nextName); 4          public void funcOne(CallBack callback) 5          { 6              ThreadPool.QueueUserWorkItem((state1) => 7              { 8                  Console.WriteLine("[One] async Continue!"); 9                  Console.WriteLine("[One] do something!");10                  callback("Called Two");11              });12          }13          public void funcTwo(CallBack callback)14          {15              ThreadPool.QueueUserWorkItem((state2) =>16                     {17                         Console.WriteLine("[Two] async Continue!");18                         Console.WriteLine("[Two] do something!");19                         callback("Called Three");20                     });21          }22          public void funcThree(CallBack callback)23          {24              Console.WriteLine("[Three] do something!");25              callback("Called ...");26          }27          static void Main()28          {29              Program p = new Program();30              p.funcOne((name1) =>31              {32                  Console.WriteLine(name1);33                  p.funcTwo((name2) =>34                  {35                      Console.WriteLine(name2);36                      //執行funcThree37                      p.funcThree((name3) =>38                      {39                          Console.WriteLine(name3);40                          //當然還有可能繼續嵌套41                          Console.WriteLine("End!");42                      });43                  });44              });45              Console.Read();46          }47      }
異步的通常實現

  相信看完代碼后我們的感覺是一樣的,好繁瑣,就是不斷的嵌套!那有沒有方法可以避免這樣呢,也就是說用同步的寫法來寫異步程序。

二、改進后的異步

  該[yield]粉墨登場了,先看代碼段[2]:

 1         //三個方法以及委托CallBack的定義不變,此處不再列出。 2         //新增了靜態的全局變量enumerator,和靜態方法funcList. 3         public static System.Collections.IEnumerator enumerator = funcList(); 4         public static System.Collections.IEnumerator funcList() 5         { 6             Program p = new Program(); 7             p.funcOne((name1) => 8             { 9                 enumerator.MoveNext();10             });11             yield return 1;12             Console.WriteLine("Called Two");13             p.funcTwo((name2) =>14             {15                 enumerator.MoveNext();16             });17             yield return 2;18             Console.WriteLine("Called Three");19             p.funcThree((name3) =>20             {21                 //當然還有可能繼續嵌套22             });23             Console.WriteLine("Called ...");24             Console.WriteLine("End!");25             yield return 3;26         }27 28       //變化后的Main函數29       static void Main()30         {31             enumerator.MoveNext();32             Console.Read();33         }    
改進后的異步

  現在看看,是不是清爽了一些,沒有無止盡的嵌套。代碼中我們只需要定義一個迭代器,在迭代器中調用需要同步執行的方法,用[yield]來分隔,各方法通過在callback里調用迭代器的MoveNext()方法來保持同步。

  通過這樣的實踐,我們可以理解為每當[yield return ..],程序會把迭代器的[上下文環境]暫時保存下來,等到MoveNext()時,再調出來繼續執行到下一個[yield return ..]。

三、是我想太多

  以上純屬瞎扯,在.net 4.5之后,我們有了神器:async/await,下面看看多么簡潔吧。

  代碼段[3]:

 1      public class Program 2     { 3         public async Task funcOne() 4         { 5             Console.WriteLine("[One] async Continue!"); 6             Console.WriteLine("[One] do something!"); 7             //await ... 8         } 9         public async Task funcTwo()10         {11             Console.WriteLine("[Two] async Continue!");12             Console.WriteLine("[Two] do something!");13             //await ...14         }15         public void funcThree()16         {17             Console.WriteLine("[Three] do something!");18         }19         public static async Task funcList()20         {21             Program p = new Program();22             await p.funcOne();23             await p.funcTwo();24             p.funcThree();25             //無盡的嵌套可以繼續await下去。26             Console.WriteLine("End!");27         }28         static void Main()29         {30             funcList();31             Console.Read();32         }33     }
async/await

  我已經感覺到了您的驚嘆之情。

  async修飾符將方法指定為異步方法(注意?。寒惒讲划惒剑⒉皇莂sync說了算,如果這個方法中沒有await語句,就算用了async修飾符,它依然是同步執行,因為它就沒有異步基因)。

  被指定為異步方法后,方法的返回值只能為Task、Task<TResult>或者void,返回的Task對象用來表示這個異步方法,你可以對這個Task對象進行控制來操作這個異步方法,詳細的可以參考msdn中給出的Task解釋與示例代碼。

  await用于掛起主線程(這里的主線程是相對的),等待這個異步方法執行完成并返回,接著才繼續執行主線程的方法。用了await,主線程才能得到異步方法返回的Task對象,以便于在主線程中對它進行操作。如果一個異步方法調用時沒有用await,那么它就會去異步執行,主線程不會等待,就像我們代碼段[3]中Main方法里對funcList方法的調用那樣。

  最后就分析到這兒吧,希望各位兄弟博友能一起討論,共同進步。

  當然,別吝嗇您的[贊]哦 :)

更新:現在大家看到的是改進之后的文章,在此謝謝文章下面幾位高手的討論,讓我學會了不少。抱拳!

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文在线资源观看视频网站免费不卡| 91久久精品国产91久久性色| 日韩电影免费在线观看中文字幕| 亚洲老板91色精品久久| 欧美自拍视频在线观看| 美女福利视频一区| 这里只有精品丝袜| 亚洲午夜女主播在线直播| 亚洲欧美国产精品va在线观看| 中文在线资源观看视频网站免费不卡| 国产精品白嫩美女在线观看| 欧美成人午夜剧场免费观看| 亚洲欧美日韩在线一区| 黄色精品一区二区| 国产免费一区二区三区在线观看| 国产精品成人品| 日韩av在线最新| 国产精品美女呻吟| 97精品视频在线播放| 性欧美亚洲xxxx乳在线观看| 91免费精品国偷自产在线| 亚洲性av在线| 亚洲成人性视频| 欧美日韩福利在线观看| 精品香蕉在线观看视频一| 欧美视频免费在线观看| 色综合久久天天综线观看| 亚洲人成啪啪网站| 2020欧美日韩在线视频| 成人在线小视频| 久久6精品影院| 日韩美女中文字幕| 国产精品久久久久久久天堂| 亚洲欧美国产va在线影院| 九九热视频这里只有精品| 久久久久久久久网站| 亚洲精品国产成人| 亚洲片在线资源| 亚洲福利视频二区| 亚洲第一精品自拍| 欧亚精品在线观看| 精品国产欧美一区二区三区成人| 亚洲国产成人久久综合一区| 久久久久久久久久av| 91久久久国产精品| 欧美激情网友自拍| 日韩激情视频在线| 亚洲女成人图区| 成人在线国产精品| 久久久av一区| 亚洲性视频网站| 亚洲一区中文字幕| 日韩中文字幕在线免费观看| 午夜精品一区二区三区在线播放| 欲色天天网综合久久| 久久99精品久久久久久噜噜| 久久精品色欧美aⅴ一区二区| 亚洲欧美一区二区三区在线| 国产视频精品免费播放| 欧美精品videosex极品1| 亚洲国产精品专区久久| 欧美成年人视频网站欧美| 欧美又大粗又爽又黄大片视频| 国产一区二区丝袜高跟鞋图片| 国产亚洲欧美一区| 成人福利网站在线观看11| 久久香蕉精品香蕉| 精品一区二区三区三区| 亚洲国内精品视频| 国产精品中文字幕在线观看| 欧美裸体男粗大视频在线观看| 国产91免费看片| 在线精品国产成人综合| 欧美精品在线视频观看| 亚洲一级黄色av| 狠狠久久亚洲欧美专区| 国产伊人精品在线| 亚洲国产成人精品一区二区| 亚洲精品一区在线观看香蕉| 日韩在线免费视频观看| 91亚洲永久免费精品| 国产va免费精品高清在线观看| 国产精品久久久久一区二区| 亚洲最新av在线网站| 日韩中文在线视频| 国产成人高清激情视频在线观看| 色婷婷亚洲mv天堂mv在影片| 亚洲一区制服诱惑| 国产精品免费网站| 国产视频在线一区二区| 亚洲最大福利网站| 成人黄在线观看| 色综合导航网站| 欧美一区二区色| 国产成人免费91av在线| 丰满岳妇乱一区二区三区| 不卡av日日日| 一本色道久久88精品综合| 亚洲理论片在线观看| 久久久久久91香蕉国产| 亚州成人av在线| 欧美在线观看网址综合| 日韩欧美高清在线视频| 国内精品视频一区| 在线观看欧美成人| 亚洲区一区二区| 日韩国产精品一区| 国产精品av免费在线观看| 欧美多人爱爱视频网站| 日韩成人小视频| 欧美重口另类videos人妖| 欧美性受xxxx黑人猛交| 91免费看片网站| 日韩理论片久久| 亚洲aaa激情| 欧美电影在线观看网站| 欧美精品成人91久久久久久久| 欧美极品美女视频网站在线观看免费| 97香蕉久久超级碰碰高清版| 欧美性猛交xxxx乱大交3| 日韩精品视频在线| 成人精品视频99在线观看免费| 亚洲午夜精品久久久久久性色| 国产成人精品一区二区三区| 正在播放国产一区| 中文字幕精品久久久久| 精品久久香蕉国产线看观看亚洲| 亚洲视频777| 亚洲精品一区二区网址| 96pao国产成视频永久免费| 欧美日韩中文字幕日韩欧美| 日韩在线视频免费观看| 国产一区av在线| 有码中文亚洲精品| 国产视频精品va久久久久久| 国内精品模特av私拍在线观看| 国产精品视频区| 欧美在线观看日本一区| 日韩欧美精品免费在线| 色偷偷av亚洲男人的天堂| 成人黄色短视频在线观看| 亚洲激情视频在线播放| 一区二区国产精品视频| 亚洲国产欧美一区二区丝袜黑人| 亚洲图片在区色| 精品二区三区线观看| 日韩中文字幕网址| 91精品国产91久久久久久吃药| 92国产精品视频| 国产成人一区二| 亚洲国产日韩精品在线| 久久久精品欧美| 国产亚洲精品久久久久动| 最新69国产成人精品视频免费| 亚洲最大福利网| 91中文在线观看| 2018国产精品视频| 日韩av一区在线| 亚洲大胆人体视频| 国自产精品手机在线观看视频| 成人中文字幕+乱码+中文字幕| 久久久久久久久久久网站| 欧美三级xxx| 日韩美女免费视频|