如何将已有的List/Collection转换为IAsyncEnumerable类型
解决方案
最简实现
.NET 6及以上版本内置了ToAsyncEnumerable()扩展方法,可以直接将内存中的IEnumerable<T>转换为IAsyncEnumerable<T>,不需要手动写迭代器,性能比手动yield return更优。
改造后的代码如下:
public async Task<IAsyncEnumerable<PartitionModel>> GetAllPartitionsAsync(CancellationToken cancellationToken = default) { // _cache.GetOrAddAsync() returns List<PartitionModel> var list = await _cache.GetOrAddAsync(CacheKey, () => FetchAllPartitionsAsync(cancellationToken), CacheOptions); return list.ToAsyncEnumerable(); }
版本兼容说明
- 目标框架为.NET 6 及以上:无需额外依赖,可直接调用该方法
- 目标框架为.NET 5 及更早版本:需要安装
System.Linq.AsyncNuGet包后使用
开销说明
官方提供的ToAsyncEnumerable实现仅对原集合的同步枚举器做了轻量包装,没有额外的集合遍历操作,也不会产生手动yield return带来的状态机实例化开销,完全符合你降低性能损耗的要求。
取消令牌注意事项
你传入的取消令牌已经在缓存获取/数据拉取阶段生效,内存列表的枚举过程耗时极短,通常不需要额外处理取消逻辑。如果确实需要支持枚举阶段取消,可以在消费IAsyncEnumerable<T>时调用WithCancellation(cancellationToken)方法即可。
内容的提问来源于stack exchange,提问作者Tobias J
相关产品推荐
相关产品推荐

