Udostępnij za pośrednictwem


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

Czeka na komunikat.Zajmie to pierwszej wiadomości w kolejności przybycia.

Ścieżka obszaru nazw/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
    Typ: int

    Opcjonalne limit czasu w milisekundach.Domyślnie -1, która odpowiada Infinite.

Wyjątki

Wyjątek

Warunek

TimeoutException

Generowany po przekroczeniu limitu czasu.

Wartość zwracana

Asynchroniczne obliczeń (Async obiektu), zwraca odebranej wiadomości.

Uwagi

Ta metoda jest do użytku w ramach organu agenta.Dla każdego agenta może być aktywny, co najwyżej jeden czytnik równoczesnych tak nie więcej niż jedno wywołanie równoczesnych Receive, TryReceive, skanowania lub TryScan może być aktywne.

Przykład

Poniższy przykład pokazuje, jak używać Receive metody.W tym przypadku jest określony limit czasu na 10 sekund.Ogólnie rzecz biorąc, funkcja przetwarzania wiadomości działa w innym wątku z Post funkcjonować tak musi połowu wyjątek limitu czasu w funkcji procesora wiadomości.W tym przykładzie wyjątek limitu czasu powoduje tylko pętli kontynuować 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ępujące typowe sesji.Należy zauważyć, że wiadomości 2 jest pominięta, z powodu limitu czasu.

  
  
  
  
  
  
  
  
  

Platformy

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

Informacje o wersji

F# Core wersji biblioteki

Obsługiwane: 2.0, 4.0, przenośne

Zobacz też

Informacje

Control.MailboxProcessor < "Msg > Klasa (F#)

Obszar nazw Microsoft.FSharp.Control (F#)