MailboxProcessor.TryPostAndReply<'Msg,'Reply> Yöntemi (F#)
Gibi MailboxProcessor.PostAndReply, ancak döndürür None zaman aşımı süresi içinde yanıt ise.
Ad alanı/modül yolu: Microsoft.FSharp.Control
Derleme: FSharp.Core (FSharp.Core.dll),
// Signature:
member this.TryPostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply option
// Usage:
mailboxProcessor.TryPostAndReply (buildMessage)
mailboxProcessor.TryPostAndReply (buildMessage, timeout = timeout)
Parametreler
buildMessage
Türü: AsyncReplyChannel<'Reply> -> 'MsgBirleştirmek için işlev AsyncReplyChannel iletisinin gönderilmesi halinde.
timeout
Türü: intBir yanıt iletisi için beklenecek isteğe bağlı zaman aşımı parametresi (milisaniye cinsinden). Infinite'e karşılık gelir ve varsayılan olarak -1'dir.
Dönüş Değeri
Agent cevabı ya da None zaman aşımı süresi dolarsa.
Örnek
Aşağıdaki örnek, nasıl kullanılacağını gösterir TryPostAndReply. Bu örnekte, aracı bir süre sonunda kaynaklanan bir gecikme vardır.
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
Örnek oturumunda aşağıdaki gibidir.
Platformlar
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Sürüm Bilgisi
F# Çekirdek Kitaplığı sürümleri
Desteklenen: 2.0, 4.0, Portable