Compartilhar via


MailboxProcessor.Receive <'Msg > Método (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 opcional de tempo limite em milissegundos. Padrão é -1, o que corresponde a Infinite().

Exceções

Exceção

Condição

TimeoutException

Lançada quando o tempo limite for excedido.

Valor de retorno

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

Comentários

Este método é para uso dentro do corpo do agente. Para cada agente, no máximo um leitor simultâneo pode estar ativo, portanto, não mais de uma chamada simultânea para Receive, TryReceive, Digitalizar ou TryScan pode estar ativo.

Exemplo

The following example shows how to use the Receive method. Nesse caso, um tempo limite de 10 segundos é especificado. Em geral, o função de processamento de mensagens é executado em um thread diferente a partir de Post funcionar, portanto, você deve capturar a exceção de tempo limite na função do processador de mensagens. Neste exemplo, a exceção de tempo limite apenas faz o loop continue e aumenta o número de mensagem por 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

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

                    

Plataformas

O Windows 7, SP2 do Windows Vista, Windows XP SP3, Windows XP Professional x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2

Informações sobre versão

O tempo de execução F#

Compatível com: 2.0, 4.0

Silverlight

Compatível com: 3

Consulte também

Referência

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

Microsoft.FSharp.Control Namespace (F#)

Histórico de alterações

Date

History

Motivo

Janeiro de 2011

Exemplo de código adicionado.

Aprimoramento de informações.