Metodo MailboxProcessor.TryReceive<'Msg> (F#)
Attende un messaggio. Il metodo utilizzerà il primo messaggio in ordine di arrivo.
Percorso di spazio dei nomi/modulo: Microsoft.FSharp.Control
Assembly: FSharp.Core (in FSharp.Core.dll)
// Signature:
member this.TryReceive : ?int -> Async<'Msg option>
// Usage:
mailboxProcessor.TryReceive ()
mailboxProcessor.TryReceive (timeout = timeout)
Parametri
timeout
Tipo: intTimeout facoltativo in millisecondi. L'impostazione predefinita è -1, che corrisponde a Infinite().
Valore restituito
Calcolo asincrono dell'oggetto Async, che restituisce il messaggio ricevuto o None se il timeout è scaduto.
Note
Questo metodo deve essere utilizzato all'interno del corpo dell'agente. Se viene specificato un timeout, restituisce None se tale timeout viene superato. Questo metodo deve essere utilizzato all'interno del corpo dell'agente. Per ogni agente può essere attivo al massimo un lettore simultaneo, pertanto non può essere attiva più di una chiamata simultanea di Receive, TryReceive, Scan o TryScan.
Esempio
Nell'esempio riportato di seguito viene illustrato l'utilizzo di TryReceive. Se un messaggio non viene ricevuto entro 10 secondi, si verifica un timeout e l'ID del messaggio incrementa di 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
Di seguito viene riportata una sessione di esempio. Si noti che il messaggio numero 2 viene ignorato, a causa del timeout.
Piattaforme
Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2.
Informazioni sulla versione
F# Runtime
Supportato in: 2.0, 4.0
Silverlight
Supportato in: 3
Vedere anche
Riferimenti
Classe Control.MailboxProcessor<'Msg> (F#)
Spazio dei nomi Microsoft.FSharp.Control (F#)
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Gennaio 2011 |
Aggiunto esempio di codice. |
Miglioramento delle informazioni. |