Compartir a través de


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

    Tiempo 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. Observe que el mensaje número 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#)