Compartir a través de


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

Como MailboxProcessor.PostAndReply, pero devuelve None si no se produce ninguna respuesta dentro del plazo del tiempo de espera.

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

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

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

// Usage:
mailboxProcessor.TryPostAndReply (buildMessage)
mailboxProcessor.TryPostAndReply (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. Su valor predeterminado es -1, lo que equivale a Infinite.

Valor devuelto

Respuesta del agente o None si expira el tiempo de espera.

Ejemplo

En el ejemplo siguiente se muestra cómo utilizar TryPostAndReply. En este ejemplo, el agente tiene un retraso que, finalmente, da como resultado el agotamiento del tiempo de espera.

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();
                // The delay gets longer with each message, and eventually will trigger a timeout. 
                do! Async.Sleep(200 * n );
                if (message = "Stop") then
                    replyChannel.Reply("Stop")
                else
                    replyChannel.Reply(String.Format(formatString, n, message))
                do! loop (n + 1)
        }
    loop 0)

let asyncReadInput =
   async {
       printf "> " 
       let input = Console.ReadLine();
       return input
   }

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() =
    Async.StartWithContinuations(asyncReadInput, (fun input ->
        let reply = agent.TryPostAndReply((fun replyChannel -> input, replyChannel), 1000)
        match reply with
        | None -> printfn "Timeout exceeded."
        | Some(reply) ->
            if (reply <> "Stop") then
                printfn "Reply: %s" reply
                loop()
            else
                ()),
        (fun exn -> ()),
        (fun _ -> ()))
loop()

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

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

                   

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