Управление ресурсами при использовании "использования" внутри выражения последовательности

У меня есть простое выражение последовательности, которое использует ресурс, который я хотел бы очистить, когда я закончу:

type MyObject() =
    member this.Items =
        seq {
            use resource = ResourcePool.Get()
            let c = resource.ValueCount
            if c > 0 then
                for i in 0 .. c - 1 do
                    yield resource.GetValue i
        }

Если я затем использую последовательность для итерации, скажем, на полпути между элементами, когда будет удален ресурс?

Например:

// ...

let foo = MyObject
let item = foo.Items |> Seq.find ( fun i -> i.Name = "name" )

// ...

Будет resource утилизировать после завершения Seq.find? Или мне нужно пересмотреть мою стратегию управления ресурсами?

1 ответ

Решение

Он будет ликвидирован, когда IEnumerator распоряжается независимо от того, сколько предметов перечислено. Для функций в Seq Модуль это происходит при выходе из функции ( см.tryFind В качестве примера). GetEnumerator редко вызывается непосредственно в пользовательском коде, но когда это происходит, это нужно сделать с помощью use вместо let,

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