Уступка с 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 Объекты правильно, тогда вам лучше не использовать блок итератора с ленивой оценкой. Если вы хотите убедиться, что даже если вызывающий не "играет хорошо", вы с нетерпением оцените метод (т.е. возьмите имеющийся у вас код, сбросьте результаты в список и затем верните этот список). Если последствия не утилизации ресурса в первую очередь или полностью связаны с производительностью (не высвобождение некоторой памяти на некоторое время, сохранение открытого соединения и т. Д.), То это может не беспокоить, но если навсегда удерживать блокировку главная проблема (т. е. заблокированный ресурс, который может привести к взаимным блокировкам, если не освободить его), то преимущество ленивой оценки может не стоить того.

Другие вопросы по тегам