gpt4 book ai didi

f# - 如何使用序列表达式按需从网络流返回行

转载 作者:行者123 更新时间:2023-12-02 14:36:53 36 4
gpt4 key购买 nike

这个函数很好,但它没有达到我想要的效果,但我已经使用它来确保对象的使用是正确的:

   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

谢谢

最佳答案

这应该有效:

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

在您的原始代码片段中,它在 getStreamData_OnDemand 返回后被处置,但那是在您开始迭代序列之前 - 因此,当您开始迭代序列时,它已经被处置!

关于f# - 如何使用序列表达式按需从网络流返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185546/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com