2

非同期メッセージ ベースのメソッドの使用方法を学ぼうとしています。以下は、私がやろうとしていたことの簡略化されたバージョンです。MailboxProcessorオブジェクト内で有限状態マシンを使用しようとしています。全体として、イベント ベースのメソッドを使用する場合に比べて、ロジックがはるかに簡単になるようです。を使用しようとすると問題が発生しますAsync.Parallel。次のコードでは、printfn "Eval %i" vステートメントがi1&i2に対してそれぞれ 1 回だけではなく 2 回評価されています。これは、私が適切に使用していないと信じるように導きます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
4

1 に答える 1