MailboxProcessor.Receive<'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.Receive : ?int -> Async<'Msg>
// Usage:
mailboxProcessor.Receive ()
mailboxProcessor.Receive (timeout = timeout)
Parámetros
timeout
Tipo: intTiempo de espera opcional en milisegundos. Su valor predeterminado es -1, lo que equivale a Infinite.
Excepciones
Excepción |
Condición |
---|---|
Se produce cuando se supera el tiempo de espera. |
Valor devuelto
Cálculo asincrónico (objeto Async) que devuelve el mensaje recibido.
Comentarios
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 siguiente ejemplo, se muestra cómo utilizar el método Receive. En este caso, se especifica un tiempo de espera de 10 segundos. En general, la función de procesamiento de mensajes se ejecuta en un subproceso distinto de la función Post, por lo que debe detectar la excepción de tiempo de espera en la función del procesador del mensaje. En este ejemplo, la excepción de tiempo de espera simplemente hace que el bucle continúe, y aumenta el número de mensaje 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 {
try
let! (message, replyChannel) = inbox.Receive(10000);
if (message = "Stop") then
replyChannel.Reply("Stop")
else
replyChannel.Reply(String.Format(formatString, n, message))
do! loop (n + 1)
with
| :? TimeoutException ->
printfn "The mailbox processor timed out."
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 rec loop() =
printf "> "
let input = Console.ReadLine()
let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
if (reply <> "Stop") then
printfn "Reply: %s" reply
loop()
else
()
loop()
printfn "Press Enter to continue."
Console.ReadLine() |> ignore
A continuación se muestra una sesión típica. Tenga en cuenta que el mensaje 2 se omite porque se agotó el tiempo de espera.
Plataformas
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Información de versiones
Versiones de la biblioteca básica de F#
Se admite en las versiones: 2.0, 4.0, Portable