IAsyncEnumerable 方法中的正确处理?

Jul*_*rch 3 c# iasyncenumerable iasyncdisposable

答案可能是不可能,但问题是:假设您有一个 C# 方法来使用TextReader返回 的a 中的行IAsyncEnumerable<string>。如何确保在DisposeAsync调用时IAsyncEnumerator<string>TextReader被处理掉?或者这是您需要编写自定义实现才能实现的目标?

The*_*ias 6

只需在异步迭代器中使用 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Line1
Line2
Line3
已处置

  • 本案已涵盖。打破“foreach”循环会导致立即处理循环中使用的枚举器,从而导致调用迭代器内的finally块。 (3认同)