Condividi tramite


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

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

Percorso di 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

Un 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 è iniziato 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 viene riportata una sessione di esempio.L'output può essere interfogliato, il che mostra che la funzione dell'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#

Supportato in: 2,0, 4,0, portabile

Vedere anche

Riferimenti

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

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