国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何在 C# 8 中使用 異步流

開發 后端
異步編程已經流行很多年了,.NET 引入的 async 和 await 關鍵詞讓異步編程更具有可讀性,但有一個遺憾,在 C# 8 之前都不能使用異步的方式處理數據流,直到 C# 8 引入的 IAsyncEnumerable 才解決了這個問題。

[[376828]]

本文轉載自微信公眾號「碼農讀書」,作者碼農讀書。轉載本文請聯系碼農讀書公眾號。

異步編程已經流行很多年了,.NET 引入的 async 和 await 關鍵詞讓異步編程更具有可讀性,但有一個遺憾,在 C# 8 之前都不能使用異步的方式處理數據流,直到 C# 8 引入的 IAsyncEnumerable 才解決了這個問題。

說到 IAsyncEnumerable ,得先說一說 IEnumerable ,大家都知道,它是用同步的方式來迭代 collection 集合的,而這里的 IAsyncEnumerable 則是用異步方式,換句話說:IAsyncEnumerable 在迭代集合的過程中不會阻塞調用線程。

IAsyncDisposable, IAsyncEnumerable<T>,  IAsyncEnumerator<T>

異步流 允許我們可以用異步的方式處理數據,在這之前要了解下面三個接口:IAsyncDisposable, IAsyncEnumerable<T> 和 IAsyncEnumerator<T>,他們都是在 .NET Standard 2.1 中被引入,下面的代碼片段展示了這三個接口的定義。

  1. public interface IAsyncDisposable 
  2.     ValueTask DisposeAsync(); 
  3.  
  4. public interface IAsyncEnumerable<out T> 
  5.     IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken 
  6.     token = default); 
  7.  
  8. public interface IAsyncEnumerator<out T> : IAsyncDisposable 
  9.     ValueTask<bool> MoveNextAsync(); 
  10.     T Current { get; } 

為什么要使用異步流

可以想象一下你有一個數據訪問層需要從數據庫中一次性讀取所有的數據,要想使用這個功能很簡單,可以直接調用 底層提供的異步方法 XXXAsyc 實現異步調用并且一次性返回所有數據。

只要不是將所有數據都呈現在頁面上的話,這種解決方案問題不是太大,很多時候更多的是通過 分頁讀取 的形式,其實在這方面還有一個比較好的做法就是在數據可用時立即返回給調用者。

準確的說,這里可使用 異步流 的方式來解決,如果你的方法是同步返回的話,你可以使用 return yield + 返回值 IEnumerable 模式,很遺憾的是,這種方式沒有擴展性,因為它是需要阻塞調用線程的。

最好的解決方案就是 return yield + 返回值 IAsyncEnumerable 模式,異步流方法返回的是 IAsyncEnumerable實例,并且可以包含一個或多個 yield return 語句。

在 C#8 中創建異步流

下面的代碼片段展示了一個返回 Task

  1. class Program 
  2.  { 
  3.      const int DELAY = 1000; 
  4.      const int MIN = 1; 
  5.      const int MAX = 10; 
  6.  
  7.      public static async Task Main(string[] args) 
  8.      { 
  9.          foreach (int number in await GetData()) 
  10.          { 
  11.              Console.WriteLine($"{DateTime.Now}: number={number}"); 
  12.          } 
  13.  
  14.          Console.ReadLine(); 
  15.      } 
  16.  
  17.      public static async Task<IEnumerable<int>> GetData() 
  18.      { 
  19.          List<int> integers = new List<int>(); 
  20.          for (int i = MIN; i <= MAX; i++) 
  21.          { 
  22.              await Task.Delay(DELAY); 
  23.              integers.Add(i); 
  24.          } 
  25.          return integers; 
  26.      } 
  27.  } 

當運行上面的應用程序,它會等待 10s 之后再將所有的 1-10 的數字輸出控制臺上,雖然這個 GetData 是異步的,但最終還是一次性輸出了,而不是一個一個的隔秒輸出。

這個時候可以讓 yield 關鍵詞介入,它是在 C# 2.0 中被引入的,常用于執行狀態迭代 并且按一個一個的從集合中返回數據,你不需要像上面一樣創建一個集合(integers) 再返回上去,下面的代碼片段是修改 GetData 方法并且合并了 yield 關鍵詞的版本,代碼如下:

  1. static async IAsyncEnumerable<int> GetData() 
  2.    for (int i = MIN; i < MAX; i++) 
  3.    { 
  4.       yield return i; 
  5.       await Task.Delay(DELAY);   
  6.    } 

C#8 中使用異步流

要想使用異步流, 需要在 foreach 前增加一個 await 關鍵詞,如下代碼所示:

  1. public static async Task Main(string[] args) 
  2.         { 
  3.             await foreach (int number in GetData()) 
  4.             { 
  5.                 Console.WriteLine($"{DateTime.Now}: number={number}"); 
  6.             } 
  7.  
  8.             Console.ReadLine(); 
  9.         } 

下面是完整的僅供參考的代碼。

  1. class Program 
  2.    { 
  3.        const int DELAY = 1000; 
  4.        const int MIN = 1; 
  5.        const int MAX = 10; 
  6.  
  7.        public static async Task Main(string[] args) 
  8.        { 
  9.            await foreach (int number in GetData()) 
  10.            { 
  11.                Console.WriteLine($"{DateTime.Now}: number={number}"); 
  12.            } 
  13.  
  14.            Console.ReadLine(); 
  15.        } 
  16.  
  17.        static async IAsyncEnumerable<int> GetData() 
  18.        { 
  19.            for (int i = MIN; i < MAX; i++) 
  20.            { 
  21.                yield return i; 
  22.                await Task.Delay(DELAY); 
  23.            } 
  24.        } 
  25.    } 

C# 8 中一個非常重要的特性就是支持了 IAsyncEnumerable,它可以讓你應用程序代碼更干凈,更高效 和 更高性能。

譯文鏈接:https://www.infoworld.com/article/3531251/how-to-use-asynchronous-streams-in-csharp-80.html

 

責任編輯:武曉燕 來源: 碼農讀書
相關推薦

2021-02-01 12:36:59

C# Channels存儲

2021-01-18 05:18:18

C# 8模式C# 7

2021-01-28 05:14:40

C#接口簽名

2021-01-22 05:53:08

C# IndexRange

2020-12-31 07:31:10

C# 反射數據

2021-03-07 16:37:52

C#應用程序

2009-08-04 10:29:06

在C#中使用存儲過程

2021-11-25 00:04:16

C# 插值字符串

2015-09-16 15:11:58

C#異步編程

2018-08-03 08:37:31

設計模式IT項目GDPR

2022-06-23 08:00:53

PythonDateTime模塊

2011-08-10 09:31:41

Hibernateunion

2021-03-09 07:27:40

Kafka開源分布式

2022-05-17 08:25:10

TypeScript接口前端

2021-06-09 09:36:18

DjangoElasticSearLinux

2015-08-27 09:46:09

swiftAFNetworkin

2024-01-18 08:37:33

socketasyncio線程

2019-09-16 19:00:48

Linux變量

2014-07-02 09:47:06

SwiftCocoaPods

2024-09-06 11:34:15

RustAI語言
點贊
收藏

51CTO技術棧公眾號

欧美日韩午夜在线| 亚洲欧美在线一区二区| 久久天天东北熟女毛茸茸| 99成人超碰| 午夜精品福利视频| 台湾佬成人网| 欧美精品aⅴ在线视频| 四虎永久在线| 一区二区三区在线高清| 伊人影院综合在线| 亚洲国产成人午夜在线一区 | 国模雨婷捆绑高清在线| 在线观看精品一区| 欧美日韩国产综合视频| 亚洲自拍偷拍九九九| 热99在线观看| 国产精品久久久久三级| 99在线免费视频| 一区二区中文视频| 97在线观看| 亚洲免费成人av| 麻豆福利视频| 伊人一区二区三区| 伊人网在线观看| 欧美视频不卡中文| 3p在线观看| 欧美一级高清片在线观看| 免费av在线播放| 美女免费免费看网站| 91丝袜呻吟高潮美腿白嫩在线观看| 国产福利片一区二区| 久久综合综合久久综合| 亚欧精品在线| 国产精品99久| 精品视频在线观看一区| av亚洲产国偷v产偷v自拍| 精品久久久久久久久久中文字幕| 成人aa视频在线观看| av网站在线观看不卡| 国产精品乱人伦一区二区| xxxx影院| 在线免费av一区| 国产色婷婷在线| 久久久国产成人精品| 欧美成人一区在线观看| 亚洲国产综合91精品麻豆| 黄色av免费| 欧美日韩美女在线| 在线看av的网址| 亚洲国产精品人人爽夜夜爽| 久久欧美在线电影| 残酷重口调教一区二区| 欧美一区二区免费视频| 波多野结衣视频一区二区| 色妞在线综合亚洲欧美| 在线视频1区| 欧美精品一二三| 素人啪啪色综合| 欧美调教femdomvk| 草草影院在线| 久久99青青精品免费观看| 成人在线一区| 日韩免费电影一区二区| 99久久久精品免费观看国产蜜| 最近久乱中文字幕| 91久久一区二区| 欧美日韩免费看片| 国产精品国产福利国产秒拍| 亚洲午夜极品| 奇米精品一区二区三区在线观看一| 免费不卡在线观看av| 亚洲精品日产精品乱码不卡| 久久精品首页| 欧美精品密入口播放| 午夜精品在线免费观看| 欧美精品性视频| 国产一区二区三区四区五区入口| 天堂a√中文在线| 久久成人亚洲精品| 亚洲最黄网站| 亚洲另类第一页| 亚洲精品视频久久| 欧美二区在线观看| 成人免费毛片片v| 欧美调教视频| 欧美婷婷久久五月精品三区| 久久久久久久久久久久久久久久久久av| 99成人超碰| 粉嫩一区二区三区| 国产极品尤物在线| 99国产精品久久久久老师| 狠狠入ady亚洲精品| 欧美精品国产白浆久久久久| 日韩理论视频| 黄色一级片黄色| 欧美日韩在线播放一区| 国产伦精品一区二区三区视频 | 日韩精品视频在线免费观看| 久久久久国产一区二区| 国产探花一区在线观看| 高h视频在线播放| a级黄色片网站| 国产精品美日韩| 久久久久久久久久久9不雅视频| 高清成人av| 男女激情免费视频| 26uuu另类亚洲欧美日本一| 亚洲午夜免费视频| 欧美国产亚洲另类动漫| 色无极亚洲影院| 天天干狠狠干| 日本一区二区三区免费观看| 97视频人免费观看| 亚洲一区二区三区激情| 91麻豆精品国产91久久久平台| www国产在线观看| av在线下载| 日韩精品av| 高清欧美精品xxxxx在线看| 久久涩涩网站| 国内精品久久久久久99蜜桃| www.黄色网址.com| 欧美日韩国产精品一区二区| 亚洲品质视频自拍网| 欧美激情国产高清| 久久福利资源站| sm国产在线调教视频| 亚洲综合中文字幕在线| 欧美片第一页| 欧洲精品码一区二区三区免费看| 国产精品三级久久久久三级| 伊人久久在线| 国产日韩欧美精品| 亚洲国产日产av| 国产一区二区三区91| 久久国产精品视频在线观看| 精品国产乱码久久久久久久久 | 国产污污在线观看| 久久夜色精品亚洲噜噜国产mv| 久久九九精品| 在线观看亚洲色图| 97精品视频在线播放| 99国产精品免费网站| 麻豆传媒在线完整视频| 亚洲人av在线影院| 日韩国产精品久久久久久亚洲| 色yeye免费人成网站在线观看| 亚洲一区二区久久久久久久| 亚洲综合在线免费观看| 欧美日韩导航| 岛国毛片在线播放| 国产精品久久9| 一区二区三区欧美久久| 精品福利一区| 丁香婷婷自拍| 国产aaa精品| 欧美性xxxxhd| 欧美黄色aaaa| 久操视频在线免费播放| 日本一级淫片演员| 国产一区二区黑人欧美xxxx| 风间由美一区二区三区在线观看| 自拍偷拍欧美视频| 丰满少妇大力进入| 在线观看日韩专区| 美女黄网久久| 亚洲91av| 日本大胆人体视频| 久久久精品一区二区三区| 国产午夜精品久久| 日韩毛片在线免费看| 欧美成人一区二区三区电影| 99这里只有久久精品视频| 亚洲超碰在线观看| 亚洲一区二区三区在线免费观看| 欧美日韩亚洲国产一区| 欧美亚洲在线日韩| 国产成人综合美国十次| 国产精品2018| 欧美日韩精品欧美日韩精品 | 日韩有码视频在线| 国产精品无人区| 欧美色网址大全| h片在线观看视频免费| 国产精品无码人妻一区二区在线| 欧美丰满片xxx777| 婷婷成人综合网| 久久午夜av| 农村少妇一区二区三区四区五区| 欧美特级aaa| 91最新在线免费观看| 欧美大片在线观看| 亚洲视频资源在线| 亚洲高清二区| 成人高清一区| 作爱视频免费观看视频在线播放激情网| 亚洲japanese制服美女| 久久激情视频久久| 欧美性xxxxxxxxx| 国产一区二区三区四|