MailboxProcessor.PostAndReply<'Msg,'Reply>, méthode (F#)
Publie un message à un agent et attend une réponse sur le canal, de façon synchrone.
Espace de noms/Chemin du module : Microsoft.FSharp.Control
Assembly : FSharp.Core (in FSharp.Core.dll)
// Signature:
member this.PostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply
// Usage:
mailboxProcessor.PostAndReply (buildMessage)
mailboxProcessor.PostAndReply (buildMessage, timeout = timeout)
Paramètres
buildMessage
Type : AsyncReplyChannel<'Reply> -> 'MsgFonction permettant d'incorporer AsyncReplyChannel dans le message à envoyer.
timeout
Type : intParamètre de délai d'attente facultatif (en millisecondes) d'un message de réponse. La valeur par défaut est -1, qui correspond à Infinite().
Valeur de retour
Réponse de l'agent.
Notes
Le message est généré en appliquant buildMessage à un nouveau canal de réponse à incorporer dans le message. L'agent de réception doit traiter ce message et appeler précisément la méthode Reply une fois sur ce canal de réponse.
Exemple
L'exemple de code suivant montre comment démarrer un agent de processeur de boîte aux lettres. Dans cet exemple, chaque ligne d'entrée de la console est publiée dans une file d'attente de messages. Le programme lit chaque message et répond à l'aide d'un canal de réponse. Lorsque le message spécial d'arrêt est reçu, la réponse d'arrêt est envoyée et le programme prend fin.
open System
type Message = string * AsyncReplyChannel<string>
let formatString = "Message number {0} was received. Message contents: {1}"
let printThreadId note =
// Append the thread ID.
printfn "%d : %s" System.Threading.Thread.CurrentThread.ManagedThreadId note
let agent = MailboxProcessor<Message>.Start(fun inbox ->
let rec loop n =
async {
let! (message, replyChannel) = inbox.Receive();
printThreadId "MailboxProcessor"
if (message = "Stop") then
replyChannel.Reply("Stopping.")
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 rec loop() =
printf "> "
let input = Console.ReadLine()
printThreadId("Console loop")
let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
if (reply <> "Stopping.") then
printfn "Reply: %s" reply
loop()
else
()
loop()
printfn "Press Enter to continue."
Console.ReadLine() |> ignore
Voici un exemple de session.
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. |