Partilhar via


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

Posta uma mensagem para um agente e espera uma resposta no canal de forma assíncrona.

Caminho do namespace/módulo: Microsoft.FSharp.Control

Assembly: FSharp.Core (em 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

    A função para incorporar AsyncReplyChannel à mensagem a ser enviada.

  • timeout
    Tipo: int

    Um parâmetro de tempo limite opcional (em milissegundos) para aguardar uma mensagem de resposta. O padrão é -1 que corresponde a Infinite.

Valor de retorno

Uma computação assíncrona (objeto Async) que espera a resposta do agente.

Comentários

A mensagem é gerada ao aplicar buildMessage a um novo canal de resposta a ser incorporado à mensagem. O agente receptor deve processar essa mensagem e invocar o método Reply neste canal de resposta precisamente uma vez.

Exemplo

O exemplo de código a seguir mostra um agente processador de caixa de correio que usa PostAndAsyncReply. O valor de retorno de PostAndAsyncReply é um fluxo de trabalho assíncrono que, neste exemplo, é iniciado ao usar Async.StartWithContinuations para configurar o código que trata a resposta.

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

Aqui está uma sessão de exemplo. A saída pode ser intercalada o que mostra que esta função de processamento de mensagens está sendo executada em vários threads.

                      

Plataformas

Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2

Informações de versão

Versões da biblioteca principal F#

Suporte em: 2.0, 4.0, Portable

Consulte também

Referência

Classe Control.MailboxProcessor<'Msg> (F#)

Namespace Microsoft.FSharp.Control (F#)