Udostępnij za pośrednictwem


MailboxProcessor.TryReceive<'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.TryReceive : ?int -> Async<'Msg option>

// Usage:
mailboxProcessor.TryReceive ()
mailboxProcessor.TryReceive (timeout = timeout)

Parametry

  • timeout
    Wpisz: int

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

Wartość zwracana

Asynchroniczne obliczenie (obiekt Async), które zwraca odebraną wiadomość lub None jeśli zostanie przekroczony limit czasu.

Uwagi

Ta metoda jest do użytku w ramach organu agenta.Zwraca None jeśli limit czasu jest podany i zostanie przekroczony limit czasu.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 Uzyskaj, TryReceive, Skan lub TryScan może być aktywne.

Przykład

Poniższy przykład ilustruje sposób używania metody TryReceive.Jeśli komunikat nie zostanie odebrany w ciągu 10 sekund, zostanie przekroczony limit czasu i identyfikator wiadomości zwiększa się 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 {
                let! opt = inbox.TryReceive(10000);
                match opt with
                | None -> do! loop(n + 1)
                | Some (message, replyChannel) ->
                    // The delay gets longer with each message, and eventually triggers a timeout. 
                    if (message = "Stop") then
                        replyChannel.Reply("Stop")
                    else
                        replyChannel.Reply(String.Format(formatString, n, message))
                    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 mutable isCompleted = false 
while (not isCompleted) do
    printf "> " 
    let input = Console.ReadLine()
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stop") then
        printfn "Reply: %s" reply
    else
        isCompleted <- true

printfn "Press Enter to continue."
Console.ReadLine() |> ignore

Następujące przykładowe sesji.Należy zauważyć, że wiadomość nr 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#)