MailboxProcessor.Receive<'Msg> — Metoda (F#)
Czeka na komunikat.Zajmie to pierwszą wiadomość w kolejności przybycia.
Przestrzeń nazw/Ścieżka modułu: Microsoft.FSharp.Control
Zestaw: FSharp.Core (w FSharp.Core.dll)
// Signature:
member this.Receive : ?int -> Async<'Msg>
// Usage:
mailboxProcessor.Receive ()
mailboxProcessor.Receive (timeout = timeout)
Parametry
timeout
Wpisz: intOpcjonalny limit czasu zapisu w milisekundach.Ustaw domyślnie na -1, co odnosi się do Infinite.
Wyjątki
Wyjątek |
Warunek |
---|---|
Generowany po przekroczeniu limitu czasu. |
Wartość zwracana
Asynchroniczne obliczenie (obiekt Async), które zwraca odebraną wiadomość.
Uwagi
Ta metoda jest do użytku w ramach organu agenta.Dla każdego agenta, co najwyżej jeden równoczesny czytnik może być aktywny, więc nie więcej niż jedno równoczesne wywołanie do Receive, TryReceive, Skan lub TryScan może być aktywne.
Przykład
Poniższy przykład ilustruje sposób używania metody Receive.W tym przypadku jest określony limit czasu równy 10 sekund.Ogólnie rzecz biorąc, funkcja przetwarzania wiadomości jest uruchamiana w innym wątku z funkcji Post, dlatego należy wyłapać wyjątek limitu czasu w funkcji procesora wiadomość.W tym przykładzie wyjątek limitu czasu powoduje po prostu kontynuację pętli i zwiększenie liczby wiadomości o 1.
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 {
try
let! (message, replyChannel) = inbox.Receive(10000);
if (message = "Stop") then
replyChannel.Reply("Stop")
else
replyChannel.Reply(String.Format(formatString, n, message))
do! loop (n + 1)
with
| :? TimeoutException ->
printfn "The mailbox processor timed out."
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()
let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
if (reply <> "Stop") then
printfn "Reply: %s" reply
loop()
else
()
loop()
printfn "Press Enter to continue."
Console.ReadLine() |> ignore
Następuje typowa sesja.Należy zauważyć, że wiadomość 2 jest pomijana, ze względu na limit czasu.
Platformy
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Informacje o wersji
Wersje podstawowe biblioteki języka F#
Obsługiwane przez: 2.0, 4.0, przenośne