ここに複数状態の 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() の割り当ては、それが使用された非同期ブロックに固有です。