代码之家  ›  专栏  ›  技术社区  ›  akaphenom

如何使用序列表达式按需返回webstream中的行

f#
  •  4
  • akaphenom  · 技术社区  · 15 年前

    这个函数很好,但它没有做我想做的事情,但我已经对它进行了优化,以确保对象的使用是正常的:

       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 回复  |  直到 15 年前
        1
  •  5
  •   Tomas Petricek    15 年前

    这应该有效:

    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 只有在序列上的迭代完成后才会被释放。在第二个代码片段中,您将 响应 在从返回的序列中读取任何内容之前。

    在原始片段中,它在 getStreamData_OnDemand 返回,但那是在您开始遍历序列之前-所以当您开始遍历序列时,它已经被释放了!