C#的IAsyncEnumerable是什么?如何处理异步数据流?

来源:这里教程网 时间:2026-02-21 17:30:17 作者:

IAsyncEnumerable 是 C# 中用于表示异步数据流的接口,它允许你以异步方式逐个枚举数据项。与传统的 IEnumerable 不同,IAsyncEnumerable 支持在枚举过程中使用 await,从而避免阻塞线程,特别适合处理需要长时间获取数据的场景,比如从网络、文件或数据库中逐步读取大量数据。

什么时候用 IAsyncEnumerable

当你需要按需、异步地产生或消费一系列数据时,IAsyncEnumerable 就非常有用。典型场景包括:

从 HTTP 流中逐条读取日志或事件 分批查询数据库并实时返回结果 处理大型文件或数据流,避免一次性加载到内存 实现服务器发送事件(SSE)或 WebSocket 类似的推送模式

如何生成异步数据流?

使用 yield returnasync IAsyncEnumerable 方法可以轻松创建异步流。编译器会自动生成状态机来管理异步迭代过程。

public async IAsyncEnumerable GenerateNumbers() { for (int i = 1; i

如何消费异步数据流?

使用 await foreach 来安全地遍历 IAsyncEnumerable,它会自动处理每个元素的异步等待。

await foreach (var number in GenerateNumbers()) { Console.WriteLine(number); }

这会每 100 毫秒输出一个数字,不会阻塞主线程。

实际应用中的注意事项

处理异步流时要注意资源管理和异常处理:

确保异步流正确释放资源(如文件句柄、网络连接),可结合 IAsyncDisposable 使用 在 yield return 前的异步调用可能抛出异常,应在生成方法内部适当 try-catch 消费者也应考虑超时或取消机制,可通过 CancellationToken 传入

例如支持取消:

public async IAsyncEnumerable ReadLinesAsync( [EnumeratorCancellation] CancellationToken ct = default) { using var reader = new StreamReader("log.txt"); while (!reader.EndOfStream && !ct.IsCancellationRequested) { var line = await reader.ReadLineAsync().ConfigureAwait(false); if (line != null) yield return line; } }

基本上就这些。IAsyncEnumerable 让你在处理数据流时既能保持响应性,又能写出清晰的代码。不复杂但容易忽略的是:记得用 await foreach,别当成普通集合直接遍历。

相关推荐