Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto manualmente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

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

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

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

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.

Risposta dall'agente.

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.

Nell'esempio di codice riportato di seguito viene illustrato come avviare un agente processore della cassetta postale. In questo esempio ogni riga di input dalla console viene inserita in una coda di messaggi. Il programma legge ogni messaggio e risponde tramite un canale di risposta. Quando si riceve il messaggio speciale "Stop", viene inviata la risposta Stop e si chiude il programma.


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


Di seguito viene riportata una sessione di esempio.

            
              Test del processore della cassetta postale
Digitare del testo e premere INVIO per inviare un messaggio.
Digitare "Stop" per chiudere il programma.
> hello
1: Ciclo della console
4 : mailboxProcessor
Risposta: il messaggio numero 0 è stato ricevuto.
              Contenuto del messaggio: hello
>test
1: Ciclo della console
3 : mailboxProcessor
Risposta: il messaggio numero 1 è stato ricevuto.  Contenuto del messaggio: test
> hello?
1: Ciclo della console
4 : mailboxProcessor
Risposta: il messaggio numero 2 è stato ricevuto.  Contenuto del messaggio: hello?
> test 1 2 3
1: Ciclo della console
3 : mailboxProcessor
Risposta: il messaggio numero 3 è stato ricevuto.  Contenuto del messaggio: test 1 2 3
> Stop
1: Ciclo della console
4 : mailboxProcessor
Premere INVIO per continuare.  

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

Versioni della libreria di base F#

Supportata in: 2.0, 4.0, portabile

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft