欧洲超级联赛正式成立

admin · 2001-03-01

  

  本文转载自微信民众号「精巧码农」,作家liamwang 。转载本文请合系精巧码农民众号。

  正在浏览本文前,提议先浏览本系列的上一篇著作『明白 yield 环节字』。咱们了解,行使 C# 的 yield 环节字能够实行一个迭代器(Iterator),行使 async/await 环节字能够实行一个异步技巧。异步流(Asynchronous Stream)便是这两种功用的联络体,它实行了以异步的格式天生和花费一组数据系列的迭代器。

  异步流的赞成首要创立正在 C# 8 引入的两个接口上:

  

publicinterfaceIAsyncEnumerable<outT>{IAsyncEnumerator<T>GetAsyncEnumerator(...);}publicinterfaceIAsyncEnumerator<outT>:IAsyncDisposable{TCurrent{get;}ValueTask<bool>MoveNextAsync();}

 

  以是明白了上一篇咱们讲的 yield 环节字,就很轻易明白异步流,它只是正在本来的本原上赞成经由过程 yield return 前往异步获得的一系列了局值罢了。从序列中获取每一个元素的行动(MoveNextAsync)是一个异步操纵,元素是以零碎的格式达到,这就变成了所谓的异步流(譬喻视频流中的数据)。

  这里 IAsyncEnumerator 接口的 ValueTask 是 Task 范例轻量化的封装,它是机合范例(值范例)。行使格式与 Task 近似,但它正在同步告终劳动或前往顿时可用的了局时(这正在枚举序列时会通常产生),能够防止无须要的内存开支,比 Task 更高效。

  正在上一篇著作中的 Fibonacci 技巧中,Thread.Sleep(1000) 用来摹拟一个耗时操纵,它是同步的:

  

IEnumerable<int>Fibonacci(intcount){intprev=1;intcurr=1;for(inti=0;i<count;i++){yieldreturnprev;Thread.Sleep(1000);inttemp=prev+curr;prev=curr;curr=temp;}}

 

  为了抬高次第实行效能,咱们颇有可以需求把 Thread.Sleep(1000) 改为异步的。要是使它天生异步的数据流,该奈何做呢?这就需求同时用到迭代器和异步技巧了,也便是说技巧中要同时行使 yield return 和 async/await 环节字。要赞成这一性格,就要行使 IAsyncEnumerable 举动技巧的前往范例。因而,前文的 Fibonacci 技巧能够云云改制:

  

asyncIAsyncEnumerable<int>FibonacciAsync(intcount){intprev=1;intcurr=1;Randomr=new();for(inti=0;i<count;i++){yieldreturnprev;awaitTask.Delay(1000);inttemp=prev+curr;prev=curr;curr=temp;}}

 

  分歧的是,这个技巧许诺挪用者以异步的格式花费它天生的数字系列,换句话说便是行使 await foreach 来遍历花费这个技巧的前往了局(IAsyncEnumerable),如下所示:

  

awaitforeach(varninFibonacciAsync(10))Console.Write("{0}",n);

 

  但,要是要正在 LINQ 查问语句中花费异步流,需求先引入 System.Linq.Async NuGet 包,除此以外,行使格式没有差异:

  

IAsyncEnumerable<int>query=fromiinFibonacciAsync(10)wherei%2==0selecti*10;awaitforeach(varnumberinquery)Console.WriteLine(number);

 

  其它,正在 ASP.NET Core 的 Action 技巧中也赞成前往异步流,如上面示例:

  

[HttpGet]publicasyncIAsyncEnumerable<string>Get(){usingvardbContext=newBookContext();awaitforeach(vartitleindbContext.Books.Select(b=>b.Title).AsAsyncEnumerable())yieldreturntitle;}

 

  综上,能够看到,异步流处理了零碎数据系列的异步天生和花费题目。要了解,正在 C# 尚未异步流时,一组数据系列(IEnumerable)只可以全体异步的格式(Task

  参考:

  

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

 

文章推荐:

2022 年中国人工智能行业发展现状与市场规模分析 市场规模超 3000 亿元

该来的总要来! 切尔西老板将彻底退出英国市场

雷神黑武士四代开售:i7搭RTX3060不到9千元

智慧城市中 5G 和物联网的未来