Sdílet prostřednictvím


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

Odešle agentu zprávu a očekává na kanálu odpověď, a to synchronním způsobem.

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

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

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

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

Parametry

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

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

  • timeout
    Zadejte: int

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

Vrácená hodnota

Odpověď od agentu.

Poznámky

Zpráva je vygenerována pomocí parametru buildMessage do nového kanálu odpovědi, který má být zahrnut do zprávy.Přijímající agent musí tuto zprávu zpracovat a vyvolat metodu Reply na tomto kanálu odpovědi přesně jedenkrát.

Příklad

Následující příklad kódu znázorňuje způsob spuštění agentu procesoru poštovní schránky.V tomto příkladu jsou jednotlivé řádky vstupu z konzoly zveřejněny ve frontě zpráv.Program jednotlivé zprávy přečte a odpoví pomocí kanálu odpovědi.Pokud je přijata zvláštní zpráva "Stop", je odeslána odpověď Stop a program je ukončen.

open System

type Message = string * AsyncReplyChannel<string>

let formatString = "Message number {0} was received. Message contents: {1}" 

let printThreadId note =

    // Append the thread ID.
    printfn "%d : %s" System.Threading.Thread.CurrentThread.ManagedThreadId note


let agent = MailboxProcessor<Message>.Start(fun inbox ->
    let rec loop n =
        async {
                let! (message, replyChannel) = inbox.Receive();
                printThreadId "MailboxProcessor" 
                if (message = "Stop") then
                    replyChannel.Reply("Stopping.")
                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 rec loop() =
    printf "> " 
    let input = Console.ReadLine()
    printThreadId("Console loop")
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stopping.") then
        printfn "Reply: %s" reply
        loop()
    else
        ()
loop()

printfn "Press Enter to continue."
Console.ReadLine() |> ignore

Následuje příklad 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#)