MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> — Metoda (F#)
Publikuje komunikat do agenta i czeka na odpowiedź na kanale, asynchronicznie.
Przestrzeń nazw/Ścieżka modułu: Microsoft.FSharp.Control
Zestaw: FSharp.Core (w FSharp.Core.dll)
// Signature:
member this.PostAndAsyncReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> Async<'Reply>
// Usage:
mailboxProcessor.PostAndAsyncReply (buildMessage)
mailboxProcessor.PostAndAsyncReply (buildMessage, timeout = timeout)
Parametry
buildMessage
Typ: AsyncReplyChannel<'Reply> -> 'MsgFunkcja służąca do dołączania obiektu AsyncReplyChannel do wysyłanego komunikatu.
timeout
Typ: intOpcjonalny parametr limitu czasu (w milisekundach) oczekiwania na komunikat odpowiedzi.Wartość domyślna to -1, co odpowiada wartości Infinite.
Wartość zwracana
Obliczenie asynchroniczne (obiekt Async), które będzie oczekiwać na odpowiedź od agenta.
Uwagi
Komunikat jest generowany przez zastosowanie metody buildMessage do nowego kanału odpowiedzi, który należy dołączyć do komunikatu.Agent odbierający musi przetworzyć ten komunikat i wywoływać metodę Reply w tym kanale odpowiedzi dokładnie jeden raz.
Przykład
W poniższym przykładzie kodu pokazano agenta procesora skrzynki pocztowej używającego metody PostAndAsyncReply.Wartość zwracana przez metodę PostAndAsyncReply to asynchroniczny przepływ pracy, który w tym przykładzie rozpoczyna się od użycia metody Async.StartWithContinuations w celu skonfigurowania kodu obsługującego odpowiedź.
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
Poniżej pokazano przykładową sesję.Dane wyjściowe mogą być przemieszane, co pokazuje, że funkcja przetwarzania komunikatów działa w wielu wątkach.
Platformy
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Informacje o wersji
Wersje podstawowej biblioteki języka F#
Obsługiwane przez: 2.0, 4.0, przenośne