MailboxProcessor.PostAndReply<'Msg,'Reply> – metoda (F#)
Odešle agentu zprávu a očekává na kanálu odpověď, a to synchronním způsobem.
Obor názvů/Cesta modulu: Microsoft.FSharp.Control
Sestavení: FSharp.Core (v FSharp.Core.dll)
// Signature:
member this.PostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply
// Usage:
mailboxProcessor.PostAndReply (buildMessage)
mailboxProcessor.PostAndReply (buildMessage, timeout = timeout)
Parametry
buildMessage
Zadejte: AsyncReplyChannel<'Reply> -> 'MsgFunkce, která má zahrnout parametr AsyncReplyChannel do zprávy k odeslání.
timeout
Zadejte: intVolitelný parametr časového limitu (v milisekundách), v rámci kterého se má čekat na odpověď.Výchozí hodnota je -1, což odpovídá limitu Infinite.
Vrácená hodnota
Odpověď od agentu.
Poznámky
Zpráva je vygenerována pomocí parametru buildMessage do nového kanálu odpovědi, který má být zahrnut do zprávy.Přijímající agent musí tuto zprávu zpracovat a vyvolat metodu Reply na tomto kanálu odpovědi přesně jedenkrát.
Příklad
Následující příklad kódu znázorňuje způsob spuštění agentu procesoru poštovní schránky.V tomto příkladu jsou jednotlivé řádky vstupu z konzoly zveřejněny ve frontě zpráv.Program jednotlivé zprávy přečte a odpoví pomocí kanálu odpovědi.Pokud je přijata zvláštní zpráva "Stop", je odeslána odpověď Stop a program je ukončen.
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
Následuje příklad relace.
Platformy
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Informace o verzi
Verze základní knihovny F#
Podporováno ve verzích: 2.0, 4.0, Portable