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: intUm opcional de tempo limite em milissegundos. Padrão é -1, o que corresponde a Infinite().
Exceções
Exceção |
Condição |
---|---|
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. |