3

ここに複数状態の F# MailboxProcessor の例がありますが、なぜそれがコンパイルされるのか疑問に思っていますが、動作は予期しないものです。「Expert F# 3.0」ページ 284 で提供されている一般的な例のパターンに従おうとしています。ここでは、複数の async {} ボディを使用すると複数の状態が許可されますが、inbox.Receive() を使用できるかどうかについては具体的ではありません。各非同期で?

open System

let mb1<'T> = MailboxProcessor<string>.Start(fun inbox ->
                        let rec loop1 (n:int) = async {
                                    printfn "loop1 entry "
                                    let! msg = inbox.Receive()
                                    do! Async.Sleep(1000)
                                    printfn "loop1 calling loop2"  //msg received %A" msg
                                    return! loop2 (n+1) }

                        and loop2 (x:int) =     async {
                                    printfn "loop2 entry"
                                    let! msg2 = inbox.Receive()
                                    printfn "loop2 msg received %A" msg2
                                    printfn "loop2 calling loop1"
                                    return! loop1 (x+1) }
        loop2 0                    
                                        )

mb1.Post("data message 1")
mb1.Post("data message 2")

収量

loop2 entry
loop2 msg received "data message 1"
loop2 calling loop1
loop1 entry 
val it : unit = ()
> 
loop2 entry
loop2 msg received "data message 2"
loop2 calling loop1
loop1 entry 
val it : unit = ()
> 

だからさせて!ループ 1 の msg = inbox.Receive() はスキップされますか? loop2 は return で完了すると思っていたでしょう。loop1 とそれをさせてください!inbox.Receive() の割り当ては、それが使用された非同期ブロックに固有です。

4

1 に答える 1