IAsyncEnumerable是C# 8.0引入的异步流类型,适用于按需异步生成多个数据项的场景,支持await foreach消费、内存友好、可取消且响应及时。

IAsyncEnumerableawait foreach 消费,每个元素可独立 await,内存友好且响应及时。
当你需要以下任意一种能力时,IAsyncEnumerable 是比 List
最常用方式是使用 async yield return 语法(需方法返回 IAsyncEnumerable
示例:模拟异步分页获取用户
Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。
2
public async IAsyncEnumerable<User> GetUsersAsync(int pageSize = 10, [EnumeratorCancellation] CancellationToken ct = default)
{
int page = 0;
while (true)
{
var users = await _apiClient.GetPageAsync(page++, pageSize, ct).ConfigureAwait(false);
if (users.Length == 0) break;
<pre class="brush:php;toolbar:false;"> foreach (var user in users)
{
// 每次 yield return 都可被 await foreach 暂停等待
yield return user;
}
}}
注意:
– 方法签名必须是 async IAsyncEnumerable<t></t>,不能是 Task<iasyncenumerable>></iasyncenumerable>;
– [EnumeratorCancellation] 是可选但推荐的特性,让调用方传入的 CancellationToken 能自动注入到 yield return 的执行上下文中;
– 不要在 yield return 外部 await 长时间操作(否则会阻塞整个流),应在每次 yield 前完成必要 await。
使用 await foreach(C# 8+),它会自动处理异步枚举器的创建、移动、释放和异常传播:
await foreach (var user in GetUsersAsync(20, cancellationToken))
{
Process(user); // 同步处理
await SaveToDbAsync(user); // 也可 await 异步操作
}
关键点:
– 必须在 async 方法内使用,且外层方法需标记为 async;
– 支持直接传入 CancellationToken(会被传递到底层 yield 方法);
– 若在循环中抛出异常,会自动调用 DisposeAsync() 清理资源(前提是底层实现了 IAsyncDisposable);
– 不支持 LINQ 查询语法(如 .Where()、.Select()),但可使用 System.Linq.Async(需 NuGet 包 Microsoft.Bcl.AsyncInterfaces 或 System.Linq.Async)。
基本上就这些。IAsyncEnumerable 不复杂但容易忽略其“流式”本质——它不是异步版的 List,而是一条可暂停、可取消、低内存占用的数据流水线。
以上就是C#如何使用IAsyncEnumerable C#异步流使用详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号