.NET Core 3.0 IAsyncEnumerable的使用及示例代码
时间:2022-11-12
1、IAsyncEnumerable<T>和yield return的使用
IAsyncEnumerable<T>
是在.NET Core 3(.NET Standard 2.1)中引入的。它公开了具有MoveNextAsync()
可以等待的方法的枚举器。这意味着生产者可以在产生结果之间进行异步调用。
public async IAsyncEnumerable<Product> GetAllProducts() { Container container = cosmosClient.GetContainer(DatabaseId, ContainerId); var iterator = container.GetItemQueryIterator<Product>("SELECT * FROM c"); while (iterator.HasMoreResults) { foreach (var product in await iterator.ReadNextAsync()) { yield return product; } } }
使用await foreach()C#8中可用的新语法获取结果:
await foreach (var product in productsRepository.GetAllProducts())
{
Console.WriteLine(product);
}
2、ASP.NET Core中使用IAsyncEnumerable<T>
从.NET Core 3开始,ASP.NET能够IAsyncEnumerable<T>
从API控制器操作中返回。这意味着我们可以直接返回方法的结果-有效地将数据从数据库流式传输到HTTP响应。
[HttpGet]
public IAsyncEnumerable<Product> Get()
=> productsRepository.GetAllProducts();
3、FeedIterator<T>扩展方法使用IAsyncEnumerable<T>
通过在FeedIterator<T>上扩展方法实现Azure Cosmos DB 3.0 SDK利用IAsyncEnumerable<T>
查询数据。
public static >FeedIteratorExtensions
{
public static async IAsyncEnumerable<T> ToAsyncEnumerable<T>(this FeedIterator<T> iterator)
{
while (iterator.HasMoreResults)
{
foreach(var item in await iterator.ReadNextAsync())
{
yield return item;
}
}
}
}
简洁的方式处理查询结果:
var products = container
.GetItemQueryIterator<Product>("SELECT * FROM c")
.ToAsyncEnumerable();
await foreach (var product in products)
{
Console.WriteLine(product.Name);
}
特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。