Compartir a través de


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

Condición

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

Vea también

Referencia

Control.MailboxProcessor<'Msg> (Clase de F#)

Microsoft.FSharp.Control (Espacio de nombres de F#)