Partager via


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

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

Paramètres

  • timeout
    Type : int

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

Exceptions

Exception

Condition

TimeoutException

Levée lorsque le délai d'attente est dépassé.

Valeur de retour

Un calcul asynchrone (objet Async) qui retourne le message reçu.

Notes

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 présente l'utilisation de la méthode Receive. Dans ce cas, un délai d'attente de 10 secondes est spécifié. En règle générale, la fonction de traitement des messages est exécutée sur un thread différent de la fonction Post, c'est pourquoi vous devez intercepter l'exception de délai d'expiration dans la fonction du processeur de message. Dans cet exemple, l'exception d'expiration entraîne la poursuite de la boucle et augmente de 1 le numéro du message.

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

Une session type suit. Notez que le message 2 est ignoré, en raison du délai d'attente.

                    

Plateformes

Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2

Informations de version

Runtime F#

Pris en charge dans : 2.0, 4.0

Silverlight

Prise en charge dans : 3

Voir aussi

Référence

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

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

Historique des modifications

Date

Historique

Motif

Janvier 2011

Ajout d'un exemple de code

Améliorations apportées aux informations.