Как использовать выражение последовательности для возврата строк из веб-потока по требованию - PullRequest
4 голосов
/ 15 ноября 2010

Эта функция в порядке, но она не выполняет то, что мне хотелось бы, но я использовал ее, чтобы убедиться, что использование объектов в порядке:

   let getStreamData_ok (uri:string) =
        let request = WebRequest.Create uri 
        use response = request.GetResponse()
        use stream = response.GetResponseStream()
        use reader = new StreamReader(stream)
        while not reader.EndOfStream do 
            ignore <| reader.ReadLine() 

Я хотел бы подключитьсяв поток и вытягивать файл по одной строке за раз, по требованию.Эта функция не работает, я попытался сместить различные строки в и из выражения последовательности без какого-либо успеха:

let getStreamData_OnDemand (uri:string) =
    let request = WebRequest.Create uri 
    use response = request.GetResponse()

    seq { 
        use stream = response.GetResponseStream()
        use reader = new StreamReader(stream)
        while not reader.EndOfStream do 
            yield reader.ReadLine() 
    } 

Код использования:

let lines = getStreamData_OnDemand("http://stackoverflow.com/")
for line in lines do
    ignore line

Спасибо

1 Ответ

5 голосов
/ 15 ноября 2010

Это должно работать:

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, но это еще до того, как вы начали перебирать последовательность - поэтому, когда вы начинаете перебирать последовательность, она уже расположена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...