Sdílet prostřednictvím


MailboxProcessor.Receive < "Msg > Metoda (F#)

Čeká na zprávu.Tato první zpráva v pořadí doručení spotřebuje.

Cesta k oboru názvů nebo modul: 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
    Typ: int

    Volitelné časový limit v milisekundách.Výchozí hodnotu -1, který odpovídá Infinite.

Výjimky

Výjimka

Podmínka

TimeoutException

Vyvolána při limitu.

Vrácená hodnota

Asynchronní výpočtu (asynchronní objektu), který vrací přijaté zprávy.

Poznámky

Tato metoda je pro použití v rámci těla agent.Každý agent může být maximálně jeden Čtenář souběžné aktivní, tak více než jeden souběžných volání Receive, TryReceive, prohledávání nebo TryScan může být aktivní.

Příklad

Následující příklad ukazuje způsob použití metody Receive.V tomto případě je určen časový limit 10 sekund.Obecně se spustí funkce zpracování zprávy v jiném podprocesu z Post fungovat tak musí zachytit výjimku časový limit funkce procesoru zpráv.V tomto příkladu způsobí výjimku časový limit právě smyčky pokračovat a zvýší číslo 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ávy 2 vynechána, protože časový limit.

  
  
  
  
  
  
  
  
  

Platformy

Windows 8, Windows 7, Windows Server 2012 Windows Server 2008 R2

Informace o verzi

F# základní verze knihovny

Podporovány: 2.0, 4.0, přenosné

Viz také

Referenční dokumentace

Control.MailboxProcessor < "Msg > Třídy (F#)

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