// module Main open System open System.Threading let tid () = Thread.CurrentThread.ManagedThreadId let agent1 = MailboxProcessor.Start(fun (inbox: MailboxProcessor) -> let count = ref 0 async { while true do let! msg = inbox.Receive() incr count printfn "[%d] agent1 received %A, total=%d messages" (tid()) msg !count do! Async.Sleep 100 printfn "[%d] agent1 ..." (tid()) } ) let agent2 = MailboxProcessor.Start(fun inbox -> let rec loop count = async { let! msg = inbox.Receive() printfn "[%d] agent2 received %A, total=%d messages" (tid()) msg (count+1) do! Async.Sleep 100 printfn "[%d] agent2 ..." (tid()) return! loop (count+1) } loop 0 ) printfn "[%d] main" (tid()) ["the"; "quick"; "brown"; "fox";] |> List.map agent1.Post |> ignore ["jumps"; "over"; "the"; "lazy"; "dog";] |> List.map agent2.Post |> ignore Console.WriteLine (" to exit") Console.ReadLine () |> ignore