这篇文章主要讲解了“.NET Core 3.0中IAsyncEnumerable
站在用户的角度思考问题,与客户深入沟通,找到新丰网站设计与新丰网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、网站制作、成都外贸网站建设、企业官网、英文网站、手机端网站、网站推广、空间域名、网络空间、企业邮箱。业务覆盖新丰地区。
在本文中,我们将了解IAsyncEnumerable
也许最好的证明IAsyncEnumerable < T >有用的方式是看看在没有它的时候所面临的的困难。
比如首先有这样一段代码,按页面获取所有喜欢的帖子:
public async Task> GetPagePostsFromLikes(int pageNumber) { // 实现省略 }
然后有另一段代码调用上面这段代码:
public async Task
> GetAllPostsFromLikes() {
var allPosts = new List
();
for (int page = 0; ; page++)
{
var posts = await GetPagePostsFromLikes(page);
if (!posts.Any())
{
return allPosts;
}
allPosts.AddRange(posts);
}
}
注意,上面这个方法有一个问题,我们对每个页面的结果进行循环并放入List
也许我们可以不使用Task来替换上面的方法:
public IEnumerableGetAllPostsFromLikes() { 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
但是,请勿这样做! 上面的代码意味着如果我们从异步方法中调用第三个函数,线程池将持续迭代返回的IEnumerable,直到其完成,也就是说当有足够多的并发访问同一个线程,势必会造成阻塞。
如果我们可以用异步方法来使用yield return就好了!可惜那是不可能的……直到现在。
这个时候IAsyncEnumerable
IAsyncEnumerable
与返回任务
public async IAsyncEnumerableGetAllPostsFromLikes() { 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
[HttpGet] public IAsyncEnumerableGet() => postsRepository.GetAllPostsFromLikes();
随着时间的推移,随着.NET Core3.0和.NET Standard2.1的发展,我们将会看到IAsyncEnumerable
感谢各位的阅读,以上就是“.NET Core 3.0中IAsyncEnumerable