.NET Core 3.0中IAsyncEnumerableT有什么大不了的?

.NET Core 3.0和C# 8.0最激动人心的特性之一就是IAsyncEnumerable<T>(也就是async流)。但它有什么特别之处呢?我们现在可以用它做哪些以前不可能做到的事?

在本文中,我们将了解IAsyncEnumerable<T>要解决哪些挑战,如何在我们自己的应用程序中实现它,以及为什么IAsyncEnumerable<T>将在很多情况下取代Task<IEnumerable<T>>。

也许最好的证明IAsyncEnumerable < T >有用的方式是看看在没有它的时候所面临的的困难。

比如首先有这样一段代码,按页面获取所有喜欢的帖子:

public async Task<IEnumerable<Post>> GetPagePostsFromLikes(int pageNumber)
{
// 实现省略
}

然后有另一段代码调用上面这段代码:

public async Task<IEnumerable<Post>> GetAllPostsFromLikes()
{
var allPosts = new List<Post>();

for (int page = 0; ; page++)
{
var posts = await GetPagePostsFromLikes(page);
if (!posts.Any())
{
return allPosts;
}
allPosts.AddRange(posts);
}
}

注意,上面这个方法有一个问题,我们对每个页面的结果进行循环并放入List<Post>中,最后返回整个结果。假设有上亿个page页面的的帖子,那么所有这上亿个page页面的帖子都需要在返回值之前被加载。显然是非常低效的。

也许我们可以不使用Task来替换上面的方法:

public IEnumerable<Post> GetAllPostsFromLikes()
{
for (int page = 0; ; page++)
{
var posts = GetPagePostsFromLikes(page).GetAwaiter().GetResult();
if (!posts.Any())
{
yield break;
}
foreach (var post in posts)
{
yield return post;
}
}
}

在上面代码中,返回IEnumerable<T>的方法可以使用yield return语句将每个数据片段返回给调用者。

但是,请勿这样做! 上面的代码意味着如果我们从异步方法中调用第三个函数,线程池将持续迭代返回的IEnumerable,直到其完成,也就是说当有足够多的并发访问同一个线程,势必会造成阻塞。

 如果我们可以用异步方法来使用yield return就好了!可惜那是不可能的……直到现在。

 这个时候IAsyncEnumerable<T> 就该出场啦!!!!!!

IAsyncEnumerable<T>是在.NET Core 3 (.NET Standard 2.1)引入的。它公开了一个枚举器,该枚举器具有可以等待的MoveNextAsync()方法。这意味着生产者可以在产生结果之间进行异步调用。

与返回任务<IEnumerable<T>>不同,我们的方法现在可以返回IAsyncEnumerable<T>,并使用yield return来发送数据:

public async IAsyncEnumerable<Post> GetAllPostsFromLikes()
{
for (int page = 0; ; page++)
{
var posts = GetPagePostsFromLikes(page).GetAwaiter().GetResult();
if (!posts.Any())
{
yield break;
}
foreach (var post in posts)
{
yield return post;
}
}
}

为了使用结果,我们需要使用c# 8中新的await foreach()语法:

await foreach (var post in postsRepository.GetAllPostsFromLikes())
{
Console.WriteLine(post);
}

这个好多了。该方法生成可用的数据。调用代码以自己的节奏使用数据。

 

从.NET Core 3.0 Preview 7 开始,ASP.NET就能够从API控制器动作中返回IAsyncEnumerable<T>,这意味着我们可以直接返回方法的结果——有效地将数据从数据库流到HTTP响应。

            [HttpGet]
public IAsyncEnumerable<Post> Get()
=> postsRepository.GetAllPostsFromLikes();

随着时间的推移,随着.NET Core3.0和.NET Standard2.1的发展,我们将会看到IAsyncEnumerable<T>被用在我们通常使用Task<IEnumerable<T>>的地方。

总结

IAsyncEnumerable<T>是. net的一个很受欢迎的新特性,在很多情况下,它可以使代码更简洁、更高效。

想要了解更多,请参考以下资源:

  • Tutorial: Generate and consume async streams using C# 8.0 and .NET Core 3.0

  • C# language proposals - Async Streams

  • new features in .NET Core 3


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kullback-Leibler Divergence

本文转自&#xff1a;http://www.cnblogs.com/ywl925/p/3554502.html KL距离&#xff0c;是Kullback-Leibler差异&#xff08;Kullback-Leibler Divergence&#xff09;的简称&#xff0c;也叫做相对熵&#xff08;Relative Entropy&#xff09;。它衡量的是相同事件空间里的两…

合并K个排序链表

题目描述 合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [1->4->5,1->3->4,2->6 ] 输出: 1->1->2->3->4->4->5->6解法 归并排序法 public ListNode mergeKLists(ListNode[] lists) {i…

Shader 坐标转换

转自&#xff1a;http://www.ownself.org/blog/2010/kong-jian-zuo-biao-zhuan-huan.html 这个比较基础了&#xff0c;不过基础最重要&#xff0c;往往应该理解透彻&#xff0c;并且反复复习。 我们知道在3D画面渲染过程中对于模型的计算的一部分被称为Transforming and Ligh…

致所有.Net者和有梦想的朋友们 - 共勉

这篇文章很早就想写的了&#xff0c;主要是人到了一定的年纪&#xff0c;就想唠叨一些看法&#xff0c;认不认可不重要&#xff0c;重要的是生活给予你的酸甜苦辣&#xff0c;你都想一吐为快。 这里主要基于多年来自己的一个行业感受和以及生活感想&#xff0c;唠叨一下工作以及…

ReLU的起源

论文参考&#xff1a;Deep Sparse Rectifier Neural Networks 网页参考&#xff1a;http://www.mamicode.com/info-detail-873243.html 起源&#xff1a;传统激活函数、脑神经元激活频率研究、稀疏激活性 传统Sigmoid系激活函数 传统神经网络中最常用的两个激活函数&…

二叉树的锯齿形层次遍历

1、题目描述 给定一个二叉树&#xff0c;返回其节点值的锯齿形层次遍历。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 例如&#xff1a; 给定二叉树 [3,9,20,null,null,15,7], 3/ \9 2…

Asp.NET Core 轻松学-项目目录和文件作用介绍

前言上一章介绍了 Asp.Net Core 的前世今生&#xff0c;并创建了一个控制台项目编译并运行成功&#xff0c;本章的内容介绍 .NETCore 的各种常用命令、Asp.Net Core MVC 项目文件目录等信息&#xff0c;通过对命令的学习和操作&#xff0c;对项目结构的认识&#xff0c;进一步理…

Dubbo 常见服务治理策略

1、Dubbo体系结构 2、Dubbo容错机制 Dubbo集群容错架构图 各节点关系&#xff1a; 这里的Invoker是Provider的一个可调用Service的抽象&#xff0c;Invoker封装了Provider地址及Service接口信息。Directory代表多个Invoker&#xff0c;可以把它看成List&#xff0c;但与Lis…

Python 依赖库

ImportError: No module named cv2 解决方法&#xfeff;&#xfeff;import cv2时会出现这个问题 解决方法&#xff1a;将openCV安装目录里的python文件夹内的cv2.pyd复制到Python安装目录里Lib中site-packages内即可解决. 当然 要注意32位还是64位。 ImportError DLL load …

IT技术人员的35个特点,你占几个?

作者&#xff1a;zollty&#xff0c;资深程序员和架构师&#xff0c;私底下是个爱折腾的技术极客&#xff0c;架构师社区合伙人&#xff01;1、价值观对生活的一般看法&#xff1a;追求简单&#xff0c;安定&#xff0c;可控制的生活&#xff0c;但对家庭生活的责任持消极态度草…

ReentrantLock可重入锁使用及原理

使用场景&#xff1a;https://www.cnblogs.com/XJJD/p/8758713.html 原理实现&#xff1a;https://blog.csdn.net/weixin_39910081/article/details/80147754

LNK2001

转载自 http://bbs.csdn.net/topics/100140880 学习VC&#xff0b;&#xff0b;时经常会遇到链接错误LNK2001&#xff0c;该错误非常讨厌&#xff0c;因为对于 编程者来说&#xff0c;最好改的错误莫过于编译错误&#xff0c;而一般说来发生连接错误时&#xff0c;编译都已通…

asp.net core 腾讯验证码的接入

asp.net core 腾讯验证码的接入Intro之前使用的验证码服务是用的极验验证&#xff0c;而且是比较旧的&#xff0c;好久之前接入的&#xff0c;而且验证码服务依赖 Session&#xff0c;有点不太灵活&#xff0c;后来发现腾讯也有验证码服务&#xff0c;而且支持小程序&#xff0…

Spring boot 启动过程

先Mark&#xff0c; https://www.cnblogs.com/trgl/p/7353782.html https://blog.csdn.net/zl1zl2zl3/article/details/79765725 https://blog.csdn.net/u010811939/article/details/80592461 https://www.jianshu.com/p/dc12081b3598

ffmpeg加环境变量

转自&#xff1a;http://blog.csdn.net/leixiaohua1020/article/details/19016469 FFMPEG是命令行工具&#xff0c;因此使用起来多少还是会有些不方便。在这记录两点方便使用FFMPEG的方法&#xff1a; 1.任何目录下都可以使用FFMPEG 问题描述&#xff1a;需要转码&#xff08;播…

.NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?

前言获取UnionID是开发微信公众号/小程序中很有必要的一个环节&#xff0c;特别是针对一个公司拥有多个公众号小程序而推出的机制&#xff0c;实现打通账户一体化&#xff0c;用UnionID来区分多平台的唯一性。官方的解释&#xff1a;如果开发者拥有多个移动应用、网站应用、和公…

.NET LINQ分析AWS ELB日志避免996

前言小明是个单纯的 .NET开发&#xff0c;一天大哥叫住他&#xff0c;安排了一项任务&#xff1a;“小明&#xff0c;分析一下我们 超牛逼网站上个月的所有 AWS ELB流量日志&#xff0c;这些日志保存在 AWS S3上&#xff0c;你分析下&#xff0c;看哪个 API的响应时间中位数最长…

网络摄像头实时获取信息

转自&#xff1a;http://blog.csdn.net/yong_hen/article/details/42460387#quote 转自&#xff1a;http://blog.csdn.net/leo2007608/article/details/9885219 代码&#xff1a; openCV版本&#xff1a;2.4.10. 平台&#xff1a;win7 [cpp] view plaincopy #include <op…

微软100题第4题

转载自&#xff1a;http://blog.csdn.net/luxiaoxun/article/details/7537605 主要技术含量在于vector的使用(可变尺寸数组)和栈的概念。 题目&#xff1a;输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相…

相同类方法之间调用,注解失效的问题

问题&#xff1a; 在Spring管理的项目中&#xff0c;方法A使用了Transactional注解&#xff0c;试图实现事务性。但当同一个class中的方法B调用方法A时&#xff0c;会发现方法A中的异常不再导致回滚&#xff0c;也即事务失效了。 原因&#xff1a; Transactional是Spring提供…