Condividi tramite


Metodo MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> (F#)

Invia un messaggio a un agente e attende una risposta sul canale in modo asincrono.

Percorso spazio dei nomi/modulo: 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)

Parametri

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

    Funzione utilizzata per incorporare AsyncReplyChannel nel messaggio da inviare.

  • timeout
    Tipo: int

    Parametro di timeout facoltativo (in millisecondi) per l'attesa di un messaggio di risposta. L'impostazione predefinita è -1 che corrisponde a Infinite.

Valore restituito

Calcolo asincrono (oggetto asincrono) che aspetta la risposta da parte dell'agente.

Note

Il messaggio viene generato applicando buildMessage a un nuovo canale di risposta da incorporare nel messaggio. L'agente ricevente deve elaborare questo messaggio e richiamare esattamente una volta il metodo Reply su questo canale di risposta.

Esempio

Nell'esempio di codice riportato di seguito viene illustrato un agente del processore della cassetta postale che utilizza PostAndAsyncReply. Il valore restituito da PostAndAsyncReply è un flusso di lavoro asincrono, che in questo esempio viene avviato utilizzando Async.StartWithContinuations, per impostare il codice che gestisce la risposta.

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

Di seguito è riportato un esempio di sessione. L'output può essere interfogliato, mostrando che la funzione di elaborazione del messaggio è in esecuzione su più thread.

                      

Piattaforme

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

Informazioni sulla versione

Versioni della libreria di base F#

Supportata in: 2.0, 4.0, portabile

Vedere anche

Riferimenti

Classe Control.MailboxProcessor<'Msg> (F#)

Spazio dei nomi Microsoft.FSharp.Control (F#)