Aracılığıyla paylaş


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> -> 'Msg

    Birleştirmek için işlev AsyncReplyChannel iletisinin gönderilmesi halinde.

  • timeout
    Türü: int

    Bir 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

Ayrıca bkz.

Başvuru

Control.MailboxProcessor<'Msg> Sınıfı (F#)

Microsoft.FSharp.Control İsim Uzayı (F#)