Asynchronous F#无法在异步模式下求解函数
我真的是F#noob,我试着编写一个非常简单的程序,并行地迭代列表。这里是简化的代码Asynchronous F#无法在异步模式下求解函数,asynchronous,f#,Asynchronous,F#,我真的是F#noob,我试着编写一个非常简单的程序,并行地迭代列表。这里是简化的代码 let test = ["xx"; "yy"; "zz"] let urls = ["http://google.com";"http://google.com"] let p l = async { let t = test for k in t do printf "%s" k } let find = urls |> List.map
let test = ["xx"; "yy"; "zz"]
let urls =
["http://google.com";"http://google.com"]
let p l = async {
let t = test
for k in t do
printf "%s" k
}
let find =
urls
|> List.map p
|> Async.Parallel
|> Async.RunSynchronously
|> ignore
[<EntryPoint>]
let main argv =
find
printfn "%A" argv
0 // return an integer exit code
它永远不会越过那条线。但如果我以这种方式更改find和main函数:
let find =
urls
|> List.map p
|> Async.Parallel
[<EntryPoint>]
let main argv =
find
|> Async.RunSynchronously
|> ignore
printfn "%A" argv
0 // return an integer exit code
它在第一个版本中运行良好。因此问题在于
find
不是一个函数,而是一个值。因此,find
实际上在main
之前运行(在第一个示例中)
将定义更改为
let find()
对我来说似乎很好。因此问题在于find
不是一个函数,而是一个值。因此,find
实际上在main
之前运行(在第一个示例中)
将定义更改为
let find()
对我来说似乎很好。你说的“无法解决let t=test
”是什么意思?一定要使两个版本的行为更相似您应该将find
放入一个函数中-第二个版本的区别是async
计算在您执行async.runsynchronousy
时立即开始-但是这段代码非常混乱,因为我不知道您想做什么(我猜你复制并粘贴了默认的异步示例并删除了所有的url抓取内容?)是的,你说得对。我已经删除了所有的url抓取代码。John的aswer有效。你说“无法解决让t=test
是什么意思?一定要使两个版本的行为更相似您应该将find
放入一个函数中-第二个版本的区别是async
计算在您执行async.runsynchronousy
时立即开始-但是这段代码非常混乱,因为我不知道您想做什么(我猜您复制并粘贴了默认的异步示例,并删除了所有url获取内容?)是的,你是对的,Castern我已经删除了所有url获取代码。John的aswer有效。是的-这或将同步运行
移动到main
-似乎在入口点之外/之前启动异步
-工作流确实会将程序置于底部;)(以前从未注意到-应该有兴趣找出原因-感谢这个问题btw-+1)是-这或将运行同步
移动到主
-似乎在入口点之外/之前启动异步
-工作流确实会将程序置于底部;)(以前从未注意到-想知道原因应该很有趣-谢谢你的提问,顺便说一句-+1)
let find =
urls
|> List.map p
|> Async.Parallel
[<EntryPoint>]
let main argv =
find
|> Async.RunSynchronously
|> ignore
printfn "%A" argv
0 // return an integer exit code
let t = ["xx"; "yy"; "zz"]