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: int

    Tiempo de espera opcional en milisegundos. Su valor predeterminado es -1, lo que equivale a Infinite().

Excepciones

Excepción

Condition

TimeoutException

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 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.