MailboxProcessor.TryReceive<'Msg> (Método de F#)
Espera un mensaje. Se consumirá el primer mensaje por orden de llegada.
Espacio de nombres/Ruta de acceso del módulo: Microsoft.FSharp.Control
Ensamblado: FSharp.Core (en FSharp.Core.dll)
// Signature:
member this.TryReceive : ?int -> Async<'Msg option>
// Usage:
mailboxProcessor.TryReceive ()
mailboxProcessor.TryReceive (timeout = timeout)
Parámetros
timeout
Tipo: intTiempo de espera opcional en milisegundos. Su valor predeterminado es -1, lo que equivale a Infinite().
Valor devuelto
Cálculo asincrónico (objeto Async) que devuelve el mensaje recibido o None si se ha superado el tiempo de espera.
Comentarios
Este método se usa en el cuerpo del agente. Devuelve None si se especifica un tiempo de espera y se supera. Este método se usa en el cuerpo del agente. Por cada agente, solo puede haber un lector simultáneo activo como máximo, por lo que no puede haber más de una llamada simultánea activa a Receive, TryReceive, Scan o TryScan.
Ejemplo
En el ejemplo siguiente se muestra cómo utilizar TryReceive. Si un mensaje no se recibe en 10 segundos, aparece un tiempo de espera y el identificador de mensaje se incrementa en 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 continuación se muestra una sesión de ejemplo. Tenga en cuenta que el mensaje número 2 se omite porque se agotó el tiempo de espera.
Plataformas
Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2
Información de versiones
Runtime de F#
Se admite en las versiones: 2.0, 4.0
Silverlight
Se admite en la versión: 3
Vea también
Referencia
Control.MailboxProcessor<'Msg> (Clase de F#)
Microsoft.FSharp.Control (Espacio de nombres de F#)
Historial de cambios
Fecha |
Historial |
Motivo |
---|---|---|
Enero de 2011 |
Se ha agregado un ejemplo de código. |
Mejora de la información. |