Блокировка преобразуется в try / finally (обычное c #)
В блоках Iterator (также называемых yield) «finally» становится частью реализации IDisposable.Dispose () перечислителя ,Этот код также вызывается изнутри, когда вы используете последние данные.
«foreach» автоматически вызывает Dispose (), поэтому, если вы используете «foreach» (или обычный LINQ и т. Д.), Он будет получить разблокирован.
Однако, если вызывающая сторона использует GetEnumerator () напрямую (очень редко) и не читает все данные, а не не вызывает Dispose (), тогда блокировка будетне будет освобожден.
Я должен был бы проверить, чтобы увидеть, если или получит финализатор;он может быть выпущен GC, но я бы не стал ставить на него деньги.