首页 > 解决方案 > 在 IAsyncEnumerable 方法中正确处理?

问题描述

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

标签: c#iasyncenumerableiasyncdisposable

解决方案


只需在异步迭代器中使用 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 已
处理


推荐阅读