在 IAsyncEnumerable 方法中正确处置?



答案可能是这是不可能的,但问题是:假设您有一个 C# 方法来使用返回IAsyncEnumerable<string>TextReader中的行。您如何确保在IAsyncEnumerator<string>上调用DisposeAsync时,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("Line1nLine2nLine3");
try
{
while (true)
{
var line = await reader.ReadLineAsync();
if (line == null) break;
yield return line;
}
}
finally
{
reader.Dispose();
Console.WriteLine("Disposed");
}
}

输出:

1
号线 2号线 3

号线已处置

相关内容

  • 没有找到相关文章

最新更新