Compartir a través de


MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> (Método de F#)

Envía un mensaje a un agente y espera una respuesta en el canal, de forma asincrónica.

Espacio de nombres/Ruta de acceso del módulo: Microsoft.FSharp.Control

Ensamblado: FSharp.Core (en FSharp.Core.dll)

// Signature:
member this.PostAndAsyncReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> Async<'Reply>

// Usage:
mailboxProcessor.PostAndAsyncReply (buildMessage)
mailboxProcessor.PostAndAsyncReply (buildMessage, timeout = timeout)

Parámetros

  • buildMessage
    Tipo: AsyncReplyChannel<'Reply> -> 'Msg

    Función que se usa para incorporar AsyncReplyChannel en el mensaje que se va a enviar.

  • timeout
    Tipo: int

    Parámetro de tiempo de espera opcional (en milisegundos) durante el cual se va a esperar un mensaje de respuesta. El valor predeterminado es -1, lo que corresponde a Infinite.

Valor devuelto

Cálculo asincrónico (objeto Async) que esperará la respuesta del agente.

Comentarios

El mensaje se genera aplicando buildMessage a un nuevo canal de respuesta que se va a incorporar al mensaje. El agente receptor debe procesar este mensaje e invocar exactamente una vez el método Reply en este canal de respuesta.

Ejemplo

En el ejemplo de código siguiente se muestra un agente del procesador del buzón que usa PostAndAsyncReply. El valor devuelto de PostAndAsyncReply es un flujo de trabajo asincrónico, que en este ejemplo se inicia usando Async.StartWithContinuations para configurar el código que controla la respuesta.

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! (message, replyChannel) = inbox.Receive();
                // Delay so that the responses come in a different order. 
                do! Async.Sleep( 5000 - 1000 * n);
                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." 

let isCompleted = false 
while (not isCompleted) do
    printf "> " 
    let input = Console.ReadLine()
    let messageAsync = agent.PostAndAsyncReply(fun replyChannel -> input, replyChannel)

    // Set up a continuation function (the first argument below) that prints the reply. 
    // The second argument is the exception continuation (not used). 
    // The third argument is the cancellation continuation (not used).
    Async.StartWithContinuations(messageAsync, 
         (fun reply -> printfn "%s" reply),
         (fun _ -> ()),
         (fun _ -> ()))

printfn "Press Enter to continue."
Console.ReadLine() |> ignore

A continuación se muestra una sesión de ejemplo. La salida se puede intercalar, lo que muestra que la función de procesamiento de mensajes se ejecuta en varios subprocesos.

                      

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