Udostępnij za pośrednictwem


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

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

Parametry

  • timeout
    Typ: int

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

Wartość zwracana

Asynchroniczne obliczeń (Async obiektu), zwraca odebranej wiadomości lub None Jeśli zostanie przekroczony limit czasu.

Uwagi

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

Przykład

Poniższy przykład pokazuje, jak używać 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 próbki sesji.Należy zauważyć, że liczba wiadomości 2 jest pominięte 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#)