高级异步流:IAsyncEnumerable 与协作式取消
超越基础,实现带取消令牌、速率限制和背压的异步流,处理分页API和大文件逐行读取。 · 难度:入门 · +10XP
高级异步流:IAsyncEnumerable 与协作式取消
IAsyncEnumerable<T> 不仅支持 foreach await,还可以与 CancellationToken 配合实现优雅停机。本教程展示如何编写一个异步流生成器,支持限速(每秒 n 项)、超时取消和背压(通过 Channel 或 SemaphoreSlim)。你还会学到如何将传统的 Task<List<T>> 分页 API 转换为逐项流,减少内存占用并支持中断。
public async IAsyncEnumerable<string> ReadLinesAsync(string path, [EnumeratorCancellation] CancellationToken ct = default)
{
using var reader = File.OpenText(path);
while (!reader.EndOfStream)
{
ct.ThrowIfCancellationRequested();
yield return await reader.ReadLineAsync(ct);
await Task.Delay(100, ct); // 限速
}
}
// 调用
await foreach (var line in ReadLinesAsync("data.txt").WithCancellation(token))
{
Process(line);
}