简体   繁体   中英

mailboxprocessor does not terminate

I have a timeout exception (and I really intend to set a timeout) inside a message loop and I have tried to catch it as follows

let printerAgent = MailboxProcessor.Start(fun inbox-> 
    // the message processing function
    let rec messageLoop() = async{
        try
            // read a message
            let! msg = inbox.Receive 30000
            // process a message
            match msg with
            | Message text ->
                sw.WriteLine("{0}: {1}", DateTime.UtcNow.ToShortTimeString(), text)
                printfn "%s" text
                // loop to top
                return! messageLoop()  
            | Shutdown replyChannel ->
                replyChannel.Reply()
                // We do NOT do return! messageLoop() here
        with 
        | exc -> 
            printfn "%s" exc.Message
        }
    // start the loop 
    messageLoop() 
    )

and I can see the timout message printed in the console, but the program never ends: what am I missing?

This is how I'm calling the printerAgent in my code

printerAgent.PostAndReply( (fun replyChannel -> Shutdown replyChannel), 10000)

Notice that with inbox.Receive() it eventually terminates fine after a few minutes but my objective is setting a timeout (for example of 30 seconds) instead.

I think I see the conceptual problem. I can't terminate the message loop before I receive the final shutdown message (otherwise all the following printerAgent.Post messages sent by the program will simply remain unprocessed in the queue , without blocking the program with any error, and the final shutdown message, sent by a printerAgent.PostAndReply will timeout, also without blocking the program with any error). I should return the message loop so it can actually continue after the timeout exactly as it happens for a normal received message:

with 
| exc -> 
    printfn "%s" exc.Message
    return! messageLoop() // important! I guess I can't really terminate the message loop from here

And at this point the program terminates in the same time: I just see a lot of Timeout of Mailbox.Receive printed in the console (every n=30 seconds while the message loop is idling waiting to receive a message, so they can be informative about the elapsed time).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM