我一直在尝试学习如何使用基于异步消息的方法。以下是我正在尝试做的简化版本。我试图MailboxProcessor
在一个对象内使用一个有限状态机。总体而言,与使用基于事件的方法相比,该逻辑看起来更加直接。我尝试使用时遇到问题Async.Parallel
。在下面的代码中,printfn "Eval %i" v
语句对i1
&进行两次赋值,i2
而不是每次赋值一次。这使我相信我没有正确使用Async.Parallel
。在异步工作流中是否应该使用替代方法?
type Input(v) =
let agent =
MailboxProcessor.Start(fun inbox ->
let rec loop() =
async {
let! (msg : AsyncReplyChannel<int>) = inbox.Receive()
printfn "Eval %i" v
msg.Reply(v)
return! loop()
}
loop())
member this.Eval = agent.PostAndAsyncReply(fun r -> r)
let i1 = Input(1)
let i2 = Input(2)
async {
let! nodeValues = [ i1; i2 ]
|> Seq.map(fun n -> n.Eval)
|> Async.Parallel
return nodeValues
}
|> Async.RunSynchronously
这是F#3.0中的错误。Async.Parallel
打电话Seq.toArray
两次。在F#3.1下运行您的代码,它将只打印一次。这是F#源存储库中的修复程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句