You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将已有的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.Async NuGet包后使用

开销说明

官方提供的ToAsyncEnumerable实现仅对原集合的同步枚举器做了轻量包装,没有额外的集合遍历操作,也不会产生手动yield return带来的状态机实例化开销,完全符合你降低性能损耗的要求。

取消令牌注意事项

你传入的取消令牌已经在缓存获取/数据拉取阶段生效,内存列表的枚举过程耗时极短,通常不需要额外处理取消逻辑。如果确实需要支持枚举阶段取消,可以在消费IAsyncEnumerable<T>时调用WithCancellation(cancellationToken)方法即可。


内容的提问来源于stack exchange,提问作者Tobias J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:21:03