MailboxProcessor.Receive<'Msg> – metoda (F#)
Čeká na zprávu.To zpracuje první zprávu v pořadí doručení.
Obor názvů/cesta modulu: Microsoft.FSharp.Control
Sestavení: FSharp.Core (v FSharp.Core.dll)
// Signature:
member this.Receive : ?int -> Async<'Msg>
// Usage:
mailboxProcessor.Receive ()
mailboxProcessor.Receive (timeout = timeout)
Parametry
timeout
Zadejte: intVolitelný časový limit v milisekundách.Výchozí hodnota -1, což odpovídá Infinite.
Výjimky
Výjimka |
Podmínka |
---|---|
Vyvolána, pokud je překročen časový limit. |
Vrácená hodnota
Asynchronní výpočet (objekt Async), který vrací přijaté zprávy.
Poznámky
Tato metoda je určena pro použití v těle agenta.Pro každého agenta může být aktivní nejvýše jeden souběžný čtenář, nemůže být tedy aktivních více souběžných volání Receive, TryReceive, Scan nebo TryScan.
Příklad
Následující příklad ukazuje způsob použití metody Receive.V tomto případě je určen časový limit na 10 vteřin.Obecně funkce zpracování zprávy běží v jiném podprocesu než funkce Post, proto musíte zachytit výjimku časového limitu ve funkci zpracování zpráv.V tomto příkladu časový limit způsobí pouze pokračování výjimky smyčky a zvýší číslo zprávy 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
Následuje typická relace.Všimněte si, že zpráva 2 je vynechána kvůli vypršení časového limitu.
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