成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#.NET 拾遺補漏之理解 C# 中的異步流

網絡 通信技術
異步流(Asynchronous Stream)就是這兩種功能的結合體,它實現了以異步的方式生成和消費一組數據系列的迭代器。

[[440225]]

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

在閱讀本文前,建議先閱讀本系列的上一篇文章『理解 yield 關鍵字』。我們知道,使用 C# 的 yield 關鍵字可以實現一個迭代器(Iterator),使用 async/await 關鍵字可以實現一個異步方法。異步流(Asynchronous Stream)就是這兩種功能的結合體,它實現了以異步的方式生成和消費一組數據系列的迭代器。

異步流的支持主要建立在 C# 8 引入的兩個接口上:

  1. public interface IAsyncEnumerable<out T> 
  2.     IAsyncEnumerator<T> GetAsyncEnumerator (...); 
  3. public interface IAsyncEnumerator<out T>: IAsyncDisposable 
  4.     T Current { get; } 
  5.     ValueTask<bool> MoveNextAsync(); 

所以理解了上一篇我們講的 yield 關鍵字,就很容易理解異步流,它只是在原來的基礎上支持通過 yield return 返回異步得到的一系列結果值而已。從序列中獲取每個元素的行為(MoveNextAsync)是一個異步操作,元素是以零散的方式到達,這就形成了所謂的“異步流”(比如視頻流中的數據)。

這里 IAsyncEnumerator 接口的 ValueTask 是 Task 類型輕量化的封裝,它是結構類型(值類型)。使用方式與 Task 相似,但它在同步完成任務或返回立即可用的結果時(這在列舉序列時會經常發生),可以避免不必要的內存開銷,比 Task 更高效。

在上一篇文章中的 Fibonacci 方法中,Thread.Sleep(1000) 用來模擬一個耗時操作,它是“同步”的:

  1. IEnumerable<int> Fibonacci(int count
  2.     int prev = 1; 
  3.     int curr = 1; 
  4.     for (int i = 0; i < count; i++) 
  5.     { 
  6.         yield return prev; 
  7.         Thread.Sleep(1000); 
  8.         int temp = prev + curr; 
  9.         prev = curr; 
  10.         curr = temp
  11.     } 

為了提高程序執行效率,我們很有可能需要把 Thread.Sleep(1000) 改成“異步”的。如果使它生成異步的數據流,該怎么做呢?這就需要同時用到迭代器和異步方法了,也就是說方法中要同時使用 yield return 和 async/await 關鍵字。要支持這一特性,就要使用 IAsyncEnumerable 作為方法的返回類型。于是,前文的 Fibonacci 方法可以這樣改造:

  1. async IAsyncEnumerable<int> FibonacciAsync(int count
  2.     int prev = 1; 
  3.     int curr = 1; 
  4.     Random r = new(); 
  5.     for (int i = 0; i < count; i++) 
  6.     { 
  7.         yield return prev; 
  8.         await Task.Delay(1000); 
  9.         int temp = prev + curr; 
  10.         prev = curr; 
  11.         curr = temp
  12.     } 

不同的是,這個方法允許調用者以異步的方式消費它生成的數字系列,換句話說就是使用 await foreach 來遍歷消費這個方法的返回結果(IAsyncEnumerable),如下所示:

  1. await foreach (var n in FibonacciAsync(10)) 
  2.     Console.Write("{0} ", n); 

但,如果要在 LINQ 查詢語句中消費異步流,需要先引入 System.Linq.Async NuGet 包,除此之外,使用方式沒有差別:

  1. IAsyncEnumerable<int> query = 
  2.     from i in FibonacciAsync(10) 
  3.     where i % 2 == 0 
  4.     select i * 10; 
  5.  
  6. await foreach (var number in query) 
  7.     Console.WriteLine(number); 

另外,在 ASP.NET Core 的 Action 方法中也支持返回異步流,如下面示例:

  1. [HttpGet] 
  2. public async IAsyncEnumerable<string> Get() 
  3.     using var dbContext = new BookContext(); 
  4.     await foreach (var title in dbContext.Books 
  5.         .Select(b => b.Title) 
  6.         .AsAsyncEnumerable()) 
  7.     yield return title; 

綜上,可以看到,異步流解決了零散數據系列的異步生成和消費問題。要知道,在 C# 還沒有異步流時,一組數據系列(IEnumerable)只能以整體異步的方式(Task

參考:

  1. 《C# 9.0 in a nutshell》 
  2. https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/generate-consume-asynchronous-stream 

 

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

2024-09-23 12:35:49

2022-10-12 23:39:46

Java接口屬性

2022-10-11 09:33:04

Java異常Exception

2018-11-30 15:17:38

CPUCache緩存行

2010-03-30 08:36:26

Java框架StrutsSpring

2011-06-17 15:55:19

ArrayListC#

2009-08-25 13:53:20

C#.NET rege

2009-08-26 14:23:14

C#.Net Fram

2009-04-02 15:21:43

c#IDisposeFinalize

2010-07-20 08:50:00

autoreleaseObjective C

2009-08-13 10:35:55

C#.NET操作XML

2009-08-24 16:19:54

C#.NET綁定Off

2009-08-26 10:09:22

C#編碼規范

2009-09-01 18:26:23

C#工作流引擎

2024-05-11 07:13:33

C#Task編程

2024-06-25 08:33:48

2009-09-01 16:14:05

ArrayList與A

2021-09-13 07:00:01

C# .NET 緩存

2009-08-20 19:08:30

C#異步調用

2021-01-19 05:30:55

C# 8異步流IEnumerable
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品成人无久久精品 | 国产美女精品 | 日本不卡一区 | 在线播放中文字幕 | 国产精品永久 | 国产一区二区三区在线免费 | 精品久久久一区二区 | 亚洲毛片在线观看 | 久久国产成人午夜av影院武则天 | 日韩成人在线一区 | 亚洲一区二区免费视频 | 一区二区三区欧美 | 亚洲精品视频一区二区三区 | 欧美成人久久 | 欧美精品成人影院 | 精品视频在线免费观看 | 日本粉嫩一区二区三区视频 | av中文在线播放 | 黄色片免费在线观看 | 久久亚洲国产 | 日韩毛片网 | 国产无套一区二区三区久久 | 国产成人精品区一区二区不卡 | 国产精品美女在线观看 | 亚洲午夜视频在线观看 | 欧美a免费 | 一区视频 | 精品国产免费人成在线观看 | 欧美日韩国产精品激情在线播放 | 中文字幕一区二区三 | 欧美激情久久久 | 中文字幕高清 | 国产免费自拍 | 亚洲综合一区二区三区 | 99精品国产一区二区三区 | 日韩一区二区在线观看视频 | 久草在线| 欧美自拍第一页 | 青草青草久热精品视频在线观看 | 欧美亚洲视频在线观看 | 亚洲欧美中文日韩在线v日本 |