我一直在尝试学习如何使用基于异步消息的方法。以下是我尝试做的简化版本。我正在尝试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