MailboxProcessor.PostAndReply<'Msg,'Reply>-Methode (F#)
Stellt eine Nachricht an einen Agent bereit und erwartet gleichzeitig eine Antwort auf dem Kanal.
Namespace/Modulpfad: Microsoft.FSharp.Control
Assembly: FSharp.Core (in FSharp.Core.dll)
// Signature:
member this.PostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply
// Usage:
mailboxProcessor.PostAndReply (buildMessage)
mailboxProcessor.PostAndReply (buildMessage, timeout = timeout)
Parameter
buildMessage
Typ: AsyncReplyChannel<'Reply> -> 'MsgDie Funktion, mit der AsyncReplyChannel in die zu sendende Meldung eingefügt werden soll.
timeout
Typ: intEin optionaler Timeoutparameter (in Millisekunden), der die Wartezeit für eine Antwortmeldung angibt.Der Standardwert ist -1. Dies entspricht Infinite.
Rückgabewert
Die Antwort des Agents.
Hinweise
Die Meldung wird generiert, indem buildMessage auf einen neuen Antwortkanal angewendet wird, der in die Meldung integriert werden soll.Der empfangende Agent muss diese Meldung verarbeiten und die Reply-Methode genau einmal für diesen Antwortkanal aufrufen.
Beispiel
Das folgende Codebeispiel veranschaulicht, wie ein Postfachprozessor-Agent gestartet wird.In diesem Beispiel wird jede Eingabezeile in der Konsole an eine Nachrichtenwarteschlange gesendet.Das Programm liest jede Nachricht und antwortet mithilfe eines Antwortkanals.Wenn die Sondermeldung "Beenden" empfangen wird, wird die Antwort auf das Beenden gesendet und das Programm wird geschlossen.
open System
type Message = string * AsyncReplyChannel<string>
let formatString = "Message number {0} was received. Message contents: {1}"
let printThreadId note =
// Append the thread ID.
printfn "%d : %s" System.Threading.Thread.CurrentThread.ManagedThreadId note
let agent = MailboxProcessor<Message>.Start(fun inbox ->
let rec loop n =
async {
let! (message, replyChannel) = inbox.Receive();
printThreadId "MailboxProcessor"
if (message = "Stop") then
replyChannel.Reply("Stopping.")
else
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."
printfn "Type 'Stop' to close the program."
let rec loop() =
printf "> "
let input = Console.ReadLine()
printThreadId("Console loop")
let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
if (reply <> "Stopping.") then
printfn "Reply: %s" reply
loop()
else
()
loop()
printfn "Press Enter to continue."
Console.ReadLine() |> ignore
Beachten Sie folgende Sitzung.
Plattformen
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Versionsinformationen
F#-Kern-Bibliotheks-Versionen
Unterstützt in: 2,0, 4,0, portablen