MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> – metoda (F#)
Odešle agentu zprávu a očekává na kanálu odpověď, a to asynchronním způsobem.
Obor názvů/Cesta modulu: Microsoft.FSharp.Control
Sestavení: FSharp.Core (v FSharp.Core.dll)
// Signature:
member this.PostAndAsyncReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> Async<'Reply>
// Usage:
mailboxProcessor.PostAndAsyncReply (buildMessage)
mailboxProcessor.PostAndAsyncReply (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
Asynchronní výpočet (objekt Async), který bude očekávat 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 agent procesoru poštovní schránky, který používá parametr PostAndAsyncReply.Vrácená hodnota parametru PostAndAsyncReply je asynchronní pracovní postup, který se v tomto příkladu spouští pomocí parametru Async.StartWithContinuations pro nastavení kódu, který odpověď zpracovává.
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
Následuje příkladová relace.Výstup může být prokládaný, což znamená, že funkce zpracování zprávy je spuštěna na několika vláknech.
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