正确处理IAsyncEnumerable方法吗?

时间:2019-10-11 16:34:12

标签: c# iasyncenumerable iasyncdisposable

对此的答案可能是不可能的,但问题是:假设您有一种C#方法来使用返回TextReader的{​​{1}}中的行。您如何确保在处理IAsyncEnumerable<string>的{​​{1}}上调用DisposeAsync时?还是需要编写自定义实现来实现?

1 个答案:

答案 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
  处置