Освобождает ли перечисление автоматически созданного IAsyncEnumerable его текущий элемент перед ожиданием следующего?C#

Место общения программистов C#
Anonymous
Освобождает ли перечисление автоматически созданного IAsyncEnumerable его текущий элемент перед ожиданием следующего?

Сообщение Anonymous »

Простой пример:

Код: Выделить всё

public abstract class Example {
protected abstract Task GetItem();

public async IAsyncEnumerable Producer() {
while(true) {
yield return await GetItem();
}
}

public async Task Consumer()
{
await foreach(var item in Producer())
Console.WriteLine(item == null ? "hello" : "world); // Just print something silly to signify the JIT cannot optimise this away here
}
}
Предположим,
  • Производитель публикует действительно очень большой элемент сразу после того, как Consumr начинает перечисление.
  • Затем в течение следующего часа ничего не происходит, Производитель больше не производит предметов в течение этого времени.
Станет ли предмет бесплатным? -able (со стороны GC) практически сразу после того, как Consumer напечатает свою первую строку и достигнет второй ожидаемой итерации цикла?
Или сгенерированный перечислитель будет удерживать ссылку на первый элемент создается до тех пор, пока Producer фактически не выдаст второй элемент - то есть, по крайней мере, в течение часа?
Я знаю, что у SharpLab есть теоретический ответ, но если посмотреть на сгенерированные конечные автоматы , я, к сожалению, не очень надеюсь, что смогу это расшифровать..

Подробнее здесь: https://stackoverflow.com/questions/785 ... t-item-bef

Вернуться в «C#»