c# - 在 IAsyncEnumerable 方法中正确处理?
问题描述
对此的答案可能是不可能的,但问题是:假设您有一个 C# 方法来使用TextReader
返回的 a 中的行IAsyncEnumerable<string>
。你如何确保什么时候被DisposeAsync
调用?或者这是您需要编写自定义实现来实现的?IAsyncEnumerator<string>
TextReader
解决方案
只需在异步迭代器中使用 try-finally 块,或者更简单地使用using
块,TextReader
调用者完成枚举后就会立即释放 。枚举是否正常完成或由于异常或break
.
static async Task Main(string[] args)
{
await foreach (var line in GetLines())
{
Console.WriteLine(line);
}
}
private static async IAsyncEnumerable<string> GetLines()
{
var reader = new StringReader("Line1\nLine2\nLine3");
try
{
while (true)
{
var line = await reader.ReadLineAsync();
if (line == null) break;
yield return line;
}
}
finally
{
reader.Dispose();
Console.WriteLine("Disposed");
}
}
输出:
Line1
Line2
Line3 已
处理
推荐阅读
- android - 如何在 Flutter 中打印 String 函数的结果?
- node.js - 如何在heroku中保持工作线程活着
- html - 网页抓取
- 使用 RVEST 的 html 标签
- c# - c# winform , 如何匹配或如何从 Group 中获取 usersId
- javascript - 为引导弹出窗口插入脚本
- json - 在 Golang 中解析 JSON 数据
- reactjs - 尽管使用了备忘录并且没有更改任何道具,但对功能组件中的子项做出反应
- flutter - Flutter:flutter_tex TeXView 不工作。显示“ImeThread 未启用”
- javascript - 如何在屏幕上显示多于一部电影,而不是仅在 react native 中显示来自 moviesDB api 的一部电影?
- sql-server - 授予执行存储过程的模拟权限