Это не имеет никакого отношения к сбросу IAsyncEnumerator. Этот код пытается сгенерировать второй IAsyncEnumerator, который, как и в IEnumerable.GetEnumerator (), возможен только в некоторых видах коллекций. Если Enumerable (asyn c или нет) является абстракцией над некоторой структурой данных, предназначенной только для пересылки, то GetEnumerator / GetAsyncEnumerator завершится ошибкой.
И даже когда это не выходит из строя, иногда это дорого. Например, он может выполнять запрос к базе данных или обращаться к удаленному API каждый раз, когда перечисляется. Вот почему IEnumerable / IAsyncEnumerable заставляет плохие publi c возвращать типы из функций, так как они не описывают возможности возвращаемой коллекции, и почти единственное, что вы можете сделать со значением, это материализовать его с помощью .ToList / ToListAsyn c.
Например, это прекрасно работает:
static async IAsyncEnumerable<int> Col()
{
for (int i = 1; i <= 10; i++)
{
yield return i;
}
}
static void Main(string[] args)
{
Run().Wait();
}
static async Task Run()
{
var col = Col();
var count = await col.CountAsync();
await foreach (var dataPoint in col)
{
Console.WriteLine(dataPoint);
}
}