Compartilhar via


MailboxProcessor.TryReceive <'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.TryReceive : ?int -> Async<'Msg option>

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

Parâmetros

  • timeout
    Tipo: int

    Um opcional de tempo limite em milissegundos. Padrão é -1, o que corresponde a Infinite().

Valor de retorno

Uma computação assíncrona (Async objeto) que retorna a mensagem recebida ou None se o tempo limite for excedido.

Comentários

Este método é para uso dentro do corpo do agente. Retorna None se um tempo limite é dado e o tempo limite for excedido. 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 receber, TryReceive, Digitalizar ou TryScan pode estar ativo.

Exemplo

O exemplo a seguir mostra como usar TryReceive. Se uma mensagem não for recebida dentro de 10 segundos, um tempo limite ocorre e a identificação da mensagem é incrementado 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 {
                let! opt = inbox.TryReceive(10000);
                match opt with
                | None -> do! loop(n + 1)
                | Some (message, replyChannel) ->
                    // The delay gets longer with each message, and eventually triggers a timeout.
                    if (message = "Stop") then
                        replyChannel.Reply("Stop")
                    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 mutable isCompleted = false
while (not isCompleted) do
    printf "> "
    let input = Console.ReadLine()
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stop") then
        printfn "Reply: %s" reply
    else
        isCompleted <- true

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

Segue a uma sessão de amostra. Observe que o número da mensagem 2 é ignorado 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.