Уступка с IDisposable ресурсом
Есть ли правильный способ заработать через одноразовый ресурс? Возвращаемые объекты могут быть IDisposable, но элемент, через который они проходят, is.
Вот пример:
public static IEnumerable<T> Fetch(IEnumerable<Guid> ids)
{
using (var client = new CouchbaseClient())
{
yield return ids.Select(s => s.ToString());
}
}
Прямо сейчас, называя это не будет распоряжаться using
ресурс получен. Я знаю, что могу просто завести ToList и вернуть все сразу, но есть ли способ обработать это "должным образом", или мне нужно держать вкладку на ресурсе IDisposable и утилизировать его вручную, когда я закончу?
1 ответ
Короче говоря, вам не нужно беспокоиться об этом, пока вызывающий метод обрабатывает IEnumerator
объекты правильно.
IEnumerator
implementes IDisposable
и логика, используемая при создании блоков итераторов, на самом деле достаточно умна, чтобы выполнять все невыполненные блоки finally, когда он удаляется. Блок finally создается в результате using
позвоните, и вот где IDisposable
ресурс утилизирован.
Так что пока IEnumerator
объекты, созданные из этого IEnumerable
либо полностью повторены (в этом случае окончательный MoveNext
звонок дойдет до конца using
заблокировать и утилизировать ресурс) или утилизировать IDisposable
клиент будет распорядиться
Обратите внимание, что если вы обеспокоены тем, что пользователь вашего кода может не относиться к IEnumerator
Объекты правильно, тогда вам лучше не использовать блок итератора с ленивой оценкой. Если вы хотите убедиться, что даже если вызывающий не "играет хорошо", вы с нетерпением оцените метод (т.е. возьмите имеющийся у вас код, сбросьте результаты в список и затем верните этот список). Если последствия не утилизации ресурса в первую очередь или полностью связаны с производительностью (не высвобождение некоторой памяти на некоторое время, сохранение открытого соединения и т. Д.), То это может не беспокоить, но если навсегда удерживать блокировку главная проблема (т. е. заблокированный ресурс, который может привести к взаимным блокировкам, если не освободить его), то преимущество ленивой оценки может не стоить того.