小编Ric*_*ard的帖子

具有多个递归异步体的F#代理可以在每个中使用多个inbox.Receive()吗?

我在这里有一个多状态F#MailboxProcessor示例,只是想知道它为什么编译但行为是意外的 - F#代理只能在传入的lambda函数中有一个inbox.Receive()语句吗?我试图遵循"专家F#3.0"页面284中提供的一般示例模式,其中使用多个异步{}实体允许多个状态,但是没有具体说明是否可以使用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")
Run Code Online (Sandbox Code Playgroud)

产量

loop2 entry
loop2 …
Run Code Online (Sandbox Code Playgroud)

f# agents mailboxprocessor

3
推荐指数
1
解决办法
79
查看次数

标签 统计

agents ×1

f# ×1

mailboxprocessor ×1