Metodo MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> (F#)
Invia un messaggio a un agente e attende una risposta sul canale in modo asincrono.
Percorso spazio dei nomi/modulo: Microsoft.FSharp.Control
Assembly: FSharp.Core (in FSharp.Core.dll)
// Signature:
member this.PostAndAsyncReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> Async<'Reply>
// Usage:
mailboxProcessor.PostAndAsyncReply (buildMessage)
mailboxProcessor.PostAndAsyncReply (buildMessage, timeout = timeout)
Parametri
buildMessage
Tipo: AsyncReplyChannel<'Reply> -> 'MsgFunzione utilizzata per incorporare AsyncReplyChannel nel messaggio da inviare.
timeout
Tipo: intParametro di timeout facoltativo (in millisecondi) per l'attesa di un messaggio di risposta. L'impostazione predefinita è -1 che corrisponde a Infinite.
Valore restituito
Calcolo asincrono (oggetto asincrono) che aspetta la risposta da parte dell'agente.
Note
Il messaggio viene generato applicando buildMessage a un nuovo canale di risposta da incorporare nel messaggio. L'agente ricevente deve elaborare questo messaggio e richiamare esattamente una volta il metodo Reply su questo canale di risposta.
Esempio
Nell'esempio di codice riportato di seguito viene illustrato un agente del processore della cassetta postale che utilizza PostAndAsyncReply. Il valore restituito da PostAndAsyncReply è un flusso di lavoro asincrono, che in questo esempio viene avviato utilizzando Async.StartWithContinuations, per impostare il codice che gestisce la risposta.
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
Di seguito è riportato un esempio di sessione. L'output può essere interfogliato, mostrando che la funzione di elaborazione del messaggio è in esecuzione su più thread.
Piattaforme
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Informazioni sulla versione
Versioni della libreria di base F#
Supportata in: 2.0, 4.0, portabile