2

我一直在尝试学习如何使用基于异步消息的方法。以下是我尝试做的简化版本。我正在尝试MailboxProcessor在对象内使用有限状态机。总的来说,与使用基于事件的方法相比,逻辑似乎要简单得多。但是当我尝试使用Async.Parallel. 在语句后面的代码中,对&printfn "Eval %i" v进行了两次评估,而不是每次只评估一次。这让我相信我没有正确使用. 是否应该在异步工作流中使用替代方法?i1i2Async.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
4

1 回答 1

3

这是 F# 3.0 中的一个错误。 Async.Parallel调用Seq.toArray两次。在 F# 3.1 下运行您的代码,它只会打印一次。 这是 F# 源存储库中的修复程序。

于 2014-01-15T23:00:12.750 回答