Partager via


MailboxProcessor.TryReceive<'Msg>, méthode (F#)

Attend un message. Le premier message dans l'ordre d'arrivée sera utilisé.

Espace de noms/Chemin du module : Microsoft.FSharp.Control

Assembly : FSharp.Core (in FSharp.Core.dll)

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

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

Paramètres

  • timeout
    Type : int

    Délai d'attente facultatif en millisecondes. -1 est la valeur par défaut, qui correspond à Infinite.

Valeur de retour

Calcul asynchrone (objet Async) qui retourne le message reçu ou None si le délai d'attente est dépassé.

Notes

Cette méthode doit être utilisée dans le corps de l'agent. Retourne None si un délai d'attente est donné et qu'il a été dépassé. Cette méthode doit être utilisée dans le corps de l'agent. Pour chaque agent, un lecteur simultané au maximum pouvant être actif, un seul appel simultané à Receive, TryReceive, Scan ou TryScan peut être actif.

Exemple

L'exemple suivant montre comment utiliser TryReceive. Si un message n'est pas reçu dans un délai de 10 secondes, un délai d'attente se produit et l'ID de message est incrémenté de 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

Un exemple de session suit. Notez que le message numéro 2 est ignoré, en raison du délai d'attente.

             

Plateformes

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

Informations de version

Versions de la bibliothèque principale F#

Prise en charge dans : 2,0, 4,0, Portable

Voir aussi

Référence

Control.MailboxProcessor<'Msg>, classe (F#)

Microsoft.FSharp.Control, espace de noms (F#)