2014-01-24 306 views
4

我有一個簡單的順序表達,使資源的使用,我想清理,當我說完:資源管理

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 
     } 

如果然後,我使用序列迭代,比如說,在項目中途進行迭代,資源何時處置?

例如:

resource被佈置Seq.find後
// ... 

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

// ... 

完成?還是需要重新考慮我的資源管理策略?

回答

5

IEnumerator配置時,會被處理掉不管有多少項列舉。對於Seq模塊中的功能,當功能退出時(例如see tryFind)會發生這種情況。 GetEnumerator很少直接在用戶代碼中調用,但是當它應該用use而不是let來完成時。

+0

我想這就是我害怕...... IEnumerator何時處置?我的資源是否會長時間留在記憶中? – JDB

+0

簡短的回答是否定的。我添加了更多的細節。 – Daniel