MailboxProcessor.TryReceive<'Msg> Method (F#)
Waits for a message. This will consume the first message in arrival order.
Namespace/Module Path: Microsoft.FSharp.Control
Assembly: FSharp.Core (in FSharp.Core.dll)
// Signature:
member this.TryReceive : ?int -> Async<'Msg option>
// Usage:
mailboxProcessor.TryReceive ()
mailboxProcessor.TryReceive (timeout = timeout)
Parameters
timeout
Type: intAn optional timeout in milliseconds. Defaults to -1 which corresponds to Infinite().
Return Value
An asynchronous computation (Async object) that returns the received message or None if the timeout is exceeded.
Remarks
This method is for use within the body of the agent. Returns None if a timeout is given and the timeout is exceeded. This method is for use within the body of the agent. For each agent, at most one concurrent reader may be active, so no more than one concurrent call to Receive, TryReceive, Scan or TryScan may be active.
Example
The following example shows how to use TryReceive. If a message is not received within 10 seconds, a timeout occurs and the message ID increments by 1.
open System
type Message = string * AsyncReplyChannel<string>
let formatString = "Message number {0} was received. Message contents: {1}"
let agent = MailboxProcessor<Message>.Start(fun inbox ->
let rec loop n =
async {
let! opt = inbox.TryReceive(10000);
match opt with
| None -> do! loop(n + 1)
| Some (message, replyChannel) ->
// The delay gets longer with each message, and eventually triggers a timeout.
if (message = "Stop") then
replyChannel.Reply("Stop")
else
replyChannel.Reply(String.Format(formatString, n, message))
do! loop (n + 1)
}
loop 0)
printfn "Mailbox Processor Test"
printfn "Type some text and press Enter to submit a message."
printfn "Type 'Stop' to close the program."
let mutable isCompleted = false
while (not isCompleted) do
printf "> "
let input = Console.ReadLine()
let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
if (reply <> "Stop") then
printfn "Reply: %s" reply
else
isCompleted <- true
printfn "Press Enter to continue."
Console.ReadLine() |> ignore
A sample session follows. Notice that the message number 2 is skipped due to the timeout.
Mailbox Processor Test Type some text and press Enter to submit a message. Type 'Stop' to close the program. > test1 Reply: Message number 0 was received. Message contents: test1 > test2 Reply: Message number 1 was received. Message contents: test2 > test3 Reply: Message number 3 was received. Message contents: test3 > Stop Press Enter to continue.
Platforms
Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2
Version Information
F# Runtime
Supported in: 2.0, 4.0
Silverlight
Supported in: 3
See Also
Reference
Control.MailboxProcessor<'Msg> Class (F#)
Microsoft.FSharp.Control Namespace (F#)
Change History
Date |
History |
Reason |
---|---|---|
January 2011 |
Added code example. |
Information enhancement. |