Sdílet prostřednictvím


MailboxProcessor.TryPostAndReply<'Msg,'Reply> – metoda (F#)

Podobně jako MailboxProcessor.PostAndReply, ale vrací None, pokud není odpověď v časovém limitu.

Obor názvů/cesta modulu: Microsoft.FSharp.Control

Sestavení: FSharp.Core (v FSharp.Core.dll)

// Signature:
member this.TryPostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply option

// Usage:
mailboxProcessor.TryPostAndReply (buildMessage)
mailboxProcessor.TryPostAndReply (buildMessage, timeout = timeout)

Parametry

  • buildMessage
    Zadejte: AsyncReplyChannel<'Reply> -> 'Msg

    Funkce, která má zahrnout AsyncReplyChannel do zprávy k odeslání.

  • timeout
    Zadejte: int

    Volitelný parametr časového limitu (v milisekundách, jakou), po který se má čekat na odpověď.Výchozí hodnota -1, což odpovídá Infinite.

Vrácená hodnota

Odpověď od agenta nebo None, pokud vyprší časový limit.

Příklad

Následující příklad ukazuje, jak používat funkci TryPostAndReply.V tomto příkladu agent má zpoždění, které nakonec způsobí vypršení časového limitu.

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

Následuje ukázková relace.

                 

Platformy

Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2

Informace o verzi

Verze základní knihovny F#

Podporováno ve verzích: 2.0, 4.0, Portable

Viz také

Referenční dokumentace

Control.MailboxProcessor<'Msg> – třída (F#)

Microsoft.FSharp.Control – obor názvů (F#)