MailboxProcessor.TryPostAndReply<'Msg,'Reply>-Methode (F#)
Wie MailboxProcessor.PostAndReply, gibt jedoch None zurück, wenn innerhalb des Timeoutzeitraums keine Antwort empfangen wird.
Namespace/Modulpfad: Microsoft.FSharp.Control
Assembly: FSharp.Core (in FSharp.Core.dll)
// Signature:
member this.TryPostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply option
// Usage:
mailboxProcessor.TryPostAndReply (buildMessage)
mailboxProcessor.TryPostAndReply (buildMessage, timeout = timeout)
Parameter
buildMessage
Typ: AsyncReplyChannel<'Reply> -> 'MsgDie Funktion, mit der AsyncReplyChannel in die zu sendende Meldung eingefügt werden soll.
timeout
Typ: intEin optionaler Timeoutparameter (in Millisekunden), der die Wartezeit für eine Antwortmeldung angibt.Wird standardmäßig auf -1 festgelegt, was Infinite entspricht.
Rückgabewert
Die Antwort des Agents oder None, wenn das Timeout endet.
Beispiel
Das folgende Beispiel veranschaulicht die Verwendung von TryPostAndReply.In diesem Beispiel hat der Agent eine Verzögerung, die schließlich zu einem Timeout führt.
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! (message, replyChannel) = inbox.Receive();
// The delay gets longer with each message, and eventually will trigger a timeout.
do! Async.Sleep(200 * n );
if (message = "Stop") then
replyChannel.Reply("Stop")
else
replyChannel.Reply(String.Format(formatString, n, message))
do! loop (n + 1)
}
loop 0)
let asyncReadInput =
async {
printf "> "
let input = Console.ReadLine();
return input
}
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() =
Async.StartWithContinuations(asyncReadInput, (fun input ->
let reply = agent.TryPostAndReply((fun replyChannel -> input, replyChannel), 1000)
match reply with
| None -> printfn "Timeout exceeded."
| Some(reply) ->
if (reply <> "Stop") then
printfn "Reply: %s" reply
loop()
else
()),
(fun exn -> ()),
(fun _ -> ()))
loop()
printfn "Press Enter to continue."
Console.ReadLine() |> ignore
Eine Beispielsitzung folgt.
Plattformen
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Versionsinformationen
F#-Kern-Bibliotheks-Versionen
Unterstützt in: 2,0, 4,0, portablen