В методе, возвращающем IEnumerable<>
, я открываю и перебираю через ресурс (например, считыватель строк базы данных). По завершении цикла ресурс снова закрывается.Как я могу отменить IEnumerable?
Однако может случиться так, что вызывающий абонент решает не заканчивать перечисление. Это оставляет ресурс открытым.
Пример:
IEnumerable<Foo> Bar()
{
using (var r = OpenResource()) {
while (r.Read()) {
yield return r;
}
}
}
// OK - this closes the resource again
foreach (var foo in Bar()) {
Console.WriteLine (foo);
}
// Not OK - resource stays open!
Console.WriteLine (Bar().First());
Как бы решить эту проблему? Могу ли я легко отменить перечисление, т. Е. Сказать ему пропустить остаток цикла или удалить его (поместить код очистки в Dispose
)?
Я решил вернуть Func<Result, bool>
, чтобы пользователь мог вернуть его false
, если он сделан с повторением. Точно так же можно использовать какой-то маркер отмены. Но оба подхода кажутся мне громоздкими.
Я искал и не нашел аналогичного вопроса, хотя я уверен, что должен быть один - это довольно простой вопрос imo. – mafu
'break;' должен отменить его, и сгенерированный код должен утилизировать перечислитель. если источник не делает что-то правильно, то это необходимо исправлять. –
@ DanielA.White Я хочу отменить его в области вызывающего, а не внутри самого метода перечисления – mafu