Partilhar via


Método MailboxProcessor.Receive<'Msg> (F#)

Aguarda uma mensagem. Isso consumirá a primeira mensagem na ordem de chegada.

Caminho do namespace/módulo: Microsoft.FSharp.Control

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

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

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

Parâmetros

  • timeout
    Tipo: int

    Um tempo limite opcional em milissegundos. É padronizado para -1 que corresponde a Infinite.

Exceções

Exceção

Condição

TimeoutException

Lançado quando o tempo limite é excedido.

Valor de retorno

Uma computação assíncrona (objeto Async) que retorna a mensagem recebida.

Comentários

Esse método é para uso dentro do corpo do agente. Para cada agente, no máximo um leitor simultâneo pode estar ativo, portanto, somente uma chamada simultânea para Receive, TryReceive, Scan ou TryScan pode estar ativa.

Exemplo

O exemplo a seguir mostra como usar o método Receive. Nesse caso, um tempo limite de 10 segundos é especificado. Em geral, a função de processamento de mensagens é executada em um segmento diferente da função de Postagem, portanto você deve capturar a exceção de tempo limite na função do processador de mensagem. Nesse exemplo, a exceção de tempo limite faz com que apenas o loop continue, e aumenta o número da mensagem em 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

Segue uma sessão típica. Observe que a mensagem 2 é ignorada, devido ao tempo limite.

             

Plataformas

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

Informações de versão

Versões da biblioteca principal F#

Suportado em: 2.0, 4.0, Portátil

Consulte também

Referência

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

Namespace Microsoft.FSharp.Control (F#)