Partilhar via


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

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

Parâmetros

  • timeout
    Tipo: int

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

Valor de retorno

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

Comentários

Esse método é para uso dentro do corpo do agente. Retorna None se um tempo limite for determinado e for excedido. 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 TryReceive. Se uma mensagem não for recebida dentro de 10 segundos, um tempo limite ocorre e a identificação da mensagem é incrementa 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 {
                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 uma sessão de exemplo. 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#)