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> -> 'MsgA função para incorporar AsyncReplyChannel à mensagem a ser enviada.
timeout
Tipo: intUm 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