Compartir a través de


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

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

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

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

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

// Usage:
mailboxProcessor.PostAndReply (buildMessage)
mailboxProcessor.PostAndReply (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

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 cómo iniciar un agente del procesador del buzón. En este ejemplo, cada línea de entrada de la consola se envía a una cola de mensajes. El programa lee cada mensaje y responde utilizando un canal de respuesta. Cuando se recibe el mensaje especial “Detener”, se envía la respuesta Detener y el programa se cierra.

open System

type Message = string * AsyncReplyChannel<string>

let formatString = "Message number {0} was received. Message contents: {1}"

let printThreadId note =

    // Append the thread ID.
    printfn "%d : %s" System.Threading.Thread.CurrentThread.ManagedThreadId note


let agent = MailboxProcessor<Message>.Start(fun inbox ->
    let rec loop n =
        async {
                let! (message, replyChannel) = inbox.Receive();
                printThreadId "MailboxProcessor"
                if (message = "Stop") then
                    replyChannel.Reply("Stopping.")
                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 rec loop() =
    printf "> "
    let input = Console.ReadLine()
    printThreadId("Console loop")
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stopping.") then
        printfn "Reply: %s" reply
        loop()
    else
        ()
loop()

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

A continuación, se muestra una sesión de ejemplo.

                    

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.