Управление ресурсами при использовании "использования" внутри выражения последовательности
У меня есть простое выражение последовательности, которое использует ресурс, который я хотел бы очистить, когда я закончу:
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
,