Partager via


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

Publie un message à un agent et attend une réponse sur le canal, de façon asynchrone.

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

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

// Signature:
member this.PostAndAsyncReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> Async<'Reply>

// Usage:
mailboxProcessor.PostAndAsyncReply (buildMessage)
mailboxProcessor.PostAndAsyncReply (buildMessage, timeout = timeout)

Paramètres

  • buildMessage
    Type : AsyncReplyChannel<'Reply> -> 'Msg

    Fonction permettant d'incorporer AsyncReplyChannel dans le message à envoyer.

  • timeout
    Type : int

    Paramè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

Un calcul asynchrone (objet Async) qui attendra la 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 un agent de processeur de boîte aux lettres qui utilise PostAndAsyncReply. La valeur de retour de PostAndAsyncReply est un flux de travail asynchrone qui, dans cet exemple est démarré à l'aide de Async.StartWithContinuations, pour installer le code qui gère la réponse.

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! (message, replyChannel) = inbox.Receive();
                // Delay so that the responses come in a different order.
                do! Async.Sleep( 5000 - 1000 * n);
                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."

let isCompleted = false
while (not isCompleted) do
    printf "> "
    let input = Console.ReadLine()
    let messageAsync = agent.PostAndAsyncReply(fun replyChannel -> input, replyChannel)

    // Set up a continuation function (the first argument below) that prints the reply.
    // The second argument is the exception continuation (not used).
    // The third argument is the cancellation continuation (not used).
    Async.StartWithContinuations(messageAsync, 
         (fun reply -> printfn "%s" reply),
         (fun _ -> ()),
         (fun _ -> ()))

printfn "Press Enter to continue."
Console.ReadLine() |> ignore

Voici un exemple de session. La sortie peut être entrelacée, ce qui montre que la fonction de traitement du message s'exécute sur plusieurs threads.

                      

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.