在序列表达式中使用“use”时的资源管理

时间:2014-01-24 19:54:02

标签: f# sequence resource-management

我有一个简单的序列表达式,它使用了一个我想要在我完成时清理的资源:

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" )

// ...

Seq.find结束后会resource处理吗?或者我是否需要重新考虑我的资源管理策略?

1 个答案:

答案 0 :(得分:5)

无论枚举了多少项,都会在处置IEnumerator时处理。对于Seq模块中的函数,当函数退出时会发生这种情况(see tryFind为例)。很少直接在用户代码中调用GetEnumerator,但在使用时,应使用use代替let