Sdílet prostřednictvím


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: int

    Volitelný časový limit v milisekundách.Výchozí hodnota -1, což odpovídá Infinite.

Výjimky

Výjimka

Podmínka

TimeoutException

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

Viz také

Referenční dokumentace

Control.MailboxProcessor<'Msg> – třída (F#)

Microsoft.FSharp.Control – obor názvů (F#)