Metodo MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> (F#)
Invia un messaggio a un agente e attende una risposta sul canale in modo asincrono.
Percorso di 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
Un 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 è iniziato 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 viene riportata una sessione di esempio. L'output può essere interfogliato, il che mostra che la funzione dell'elaborazione del messaggio è in esecuzione su più thread.
Piattaforme
Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2.
Informazioni sulla versione
F# Runtime
Supportato in: 2.0, 4.0
Silverlight
Supportato in: 3
Vedere anche
Riferimenti
Classe Control.MailboxProcessor<'Msg> (F#)
Spazio dei nomi Microsoft.FSharp.Control (F#)
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Gennaio 2011 |
Aggiunto esempio di codice. |
Miglioramento delle informazioni. |