ここに複数の状態のF#MailboxProcessorの例がありますが、なぜそれがコンパイルされているのか不思議ですが、動作は予期せぬものです - F#エージェントは、渡されたラムダ関数のinbox.Receive()私は 複数の非同期{}体の使用が複数の状態を許可する "エキスパートF#3.0"のページ284にある一般的なパターンに従っているようにしようとしていますが、inbox.Receive()それぞれの非同期で使用されますか?複数の再帰非同期ボディを持つF#エージェントは、それぞれ複数の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 =()
>
そうしましょう! msg =ループ1のinbox.Receive()をスキップしますか?私はループ2がリターンで完了したと思ったでしょう!ループ1とそのlet! inbox.Receive()の割り当ては、使用された非同期ブロックに固有です。
クール、Fyodor、ありがとう!おそらく初心者の間違いなので、私は答えとMSDNのリンクを感謝します。コンパイラの要求ごとに「新しい」を追加しました。「new MailboxProcessor」 –
私の答えがあなたを助けたら、それを受け入れることを検討しますか? –
あなたの他の答えのいくつかを見て、Fyodor、私は '値の制限'が2回以上出てきたと思う。 –