Sdílet prostřednictvím


MailboxProcessor.TryReceive<'Msg> – metoda (F#)

Čeká na zprávu.To zpracuje první zprávu v pořadí doručení.

Obor názvů/cesta modulu: Microsoft.FSharp.Control

Sestavení: FSharp.Core (v FSharp.Core.dll)

// Signature:
member this.TryReceive : ?int -> Async<'Msg option>

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

Parametry

  • timeout
    Zadejte: int

    Volitelný časový limit v milisekundách.Výchozí hodnota -1, což odpovídá Infinite.

Vrácená hodnota

Asynchronní výpočet (objekt Async), který vrací přijaté zprávy, nebo None, pokud je překročen časový limit.

Poznámky

Tato metoda je určena pro použití v těle agenta.Vrátí None, pokud je dán časový limit a byl překročen.Tato metoda je určena pro použití v těle agenta.Pro každého agenta může být aktivní nejvýše jeden souběžný čtenář, nemůže být tedy aktivních více souběžných volání Receive, TryReceive, Scan nebo TryScan.

Příklad

Následující příklad ukazuje, jak používat funkci TryReceive.Pokud zprávu neobdrží do 10 sekund, dojde k vypršení časového limitu a ID zprávy se zvýší o hodnotu 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

Následuje ukázková relace.Všimněte si, že zpráva číslo 2 je vynechána kvůli vypršení časového limitu.

           

Platformy

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

Informace o verzi

Verze základní knihovny F#

Podporováno ve verzích: 2.0, 4.0, Portable

Viz také

Referenční dokumentace

Control.MailboxProcessor<'Msg> – třída (F#)

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