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

JDB*_*JDB 4 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
        }
Run Code Online (Sandbox Code Playgroud)

如果我然后使用序列迭代,例如,在项目的中途进行迭代,那么资源何时会被处置?

例如:

// ...

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

// ...
Run Code Online (Sandbox Code Playgroud)

resource在Seq.find完成后处理?或者我是否需要重新考虑我的资源管理策略?

Dan*_*iel 5

IEnumerator无论枚举多少项,它都会在处理时进行处理.对于Seq模块中的函数,当函数退出时会发生这种情况(参见tryFind示例).GetEnumerator在用户代码中很少直接调用,但是当它用于use代替时,应该用它完成let.