Это должно работать:
let getStreamData_OnDemand (uri:string) = seq {
let request = WebRequest.Create uri
use response = request.GetResponse()
use stream = response.GetResponseStream()
use reader = new StreamReader(stream)
while not reader.EndOfStream do
yield reader.ReadLine() }
Ключевое отличие от вашего второго фрагмента кода (который использует выражения последовательности ) состоит в том, что все выполняется внутри выражения последовательности. Самое главное, строка use response = ...
также заключена в выражение последовательности.
Это важно, потому что use
в этом случае означает, что response
будет располагаться только после завершения итерации по последовательности. Во втором фрагменте кода вы должны располагать response
до того, как что-либо будет прочитано из возвращенной последовательности.
В вашем исходном фрагменте он удаляется после возврата getStreamData_OnDemand
, но это еще до того, как вы начали перебирать последовательность - поэтому, когда вы начинаете перебирать последовательность, она уже расположена!