2014-01-24 4 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