Udostępnij za pośrednictwem


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

    Opcjonalny limit czasu zapisu w milisekundach.Ustaw domyślnie na -1, co odnosi się do Infinite.

Wyjątki

Wyjątek

Warunek

TimeoutException

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

Zobacz też

Informacje

Control.MailboxProcessor<'Msg> — Klasa (F#)

Microsoft.FSharp.Control — Przestrzeń nazw (F#)