Освобождает ли перечисление автоматически созданного 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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