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 : intDé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