Condividi tramite


Metodo MailboxProcessor.Receive<'Msg> (F#)

Attende un messaggio. Il metodo utilizzerà il primo messaggio in ordine di arrivo.

Percorso di spazio dei nomi/modulo: Microsoft.FSharp.Control

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

// Signature:
member this.Receive : ?int -> Async<'Msg>

// Usage:
mailboxProcessor.Receive ()
mailboxProcessor.Receive (timeout = timeout)

Parametri

  • timeout
    Tipo: int

    Timeout facoltativo in millisecondi. L'impostazione predefinita è -1, che corrisponde a Infinite().

Eccezioni

Eccezione

Condizione

TimeoutException

Generata se viene superato il timeout.

Valore restituito

Calcolo asincrono (oggetto asincrono) che restituisce il messaggio ricevuto.

Note

Questo metodo deve essere utilizzato all'interno del corpo dell'agente. Per ogni agente può essere attivo al massimo un lettore simultaneo, pertanto non può essere attiva più di una chiamata simultanea di Receive, TryReceive, Scan o TryScan.

Esempio

Nell'esempio seguente viene illustrato come utilizzare il metodo Receive. In questo caso, un timeout di 10 secondi viene specificato. In generale, la funzione di elaborazione del messaggio viene eseguita su un thread diverso dalla funzione Post pertanto è necessario intercettare l'eccezione di timeout nella funzione del processore del messaggio. In questo esempio, l'eccezione di timeout causa solo la continuazione del ciclo e aumenta il numero del messaggio di 1.

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 {            
            try
                let! (message, replyChannel) = inbox.Receive(10000);

                if (message = "Stop") then
                    replyChannel.Reply("Stop")
                else
                    replyChannel.Reply(String.Format(formatString, n, message))
                do! loop (n + 1)

            with
            | :? TimeoutException -> 
                printfn "The mailbox processor timed out."
                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()
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stop") then
        printfn "Reply: %s" reply
        loop()
    else
        ()
loop()

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

Viene di seguito riportata una sessione tipica. Si noti che il messaggio 2 viene sottoposto a override, a causa del timeout.

                    

Piattaforme

Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2.

Informazioni sulla versione

F# Runtime

Supportato in: 2.0, 4.0

Silverlight

Supportato in: 3

Vedere anche

Riferimenti

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

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

Cronologia delle modifiche

Data

Cronologia

Motivo

Gennaio 2011

Aggiunto esempio di codice.

Miglioramento delle informazioni.