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

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

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? Или мне нужно пересмотреть свою стратегию управления ресурсами?


person JDB still remembers Monica    schedule 24.01.2014    source источник


Ответы (1)


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

person Daniel    schedule 24.01.2014
comment
Я думаю, этого я и боюсь... когда утилизируется IEnumerator? Мой ресурс надолго останется в памяти? - person JDB still remembers Monica; 25.01.2014
comment
Краткий ответ: нет. Я добавил еще некоторые детали. - person Daniel; 25.01.2014