对此的答案可能是不可能的,但问题是:假设您有一种C#方法来使用返回TextReader
的{{1}}中的行。您如何确保在处理IAsyncEnumerable<string>
的{{1}}上调用DisposeAsync
时?还是需要编写自定义实现来实现?
答案 0 :(得分:2)
只需在异步迭代器中使用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
处置