Sdílet prostřednictvím


MailboxProcessor.PostAndAsyncReply < "Msg," odpověď > Metoda (F#)

Odešle zprávu do agenta a očekávat odpověď na kanálu asynchronně.

Cesta k oboru názvů nebo modul: Microsoft.FSharp.Control

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

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

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

Parametry

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

    Funkce začlenit do zprávy zasílané AsyncReplyChannel.

  • timeout
    Typ: int

    Parametr volitelný časového limitu (v milisekundách) čekání na odpověď.Výchozí hodnota je -1, který odpovídá Infinite.

Vrácená hodnota

Výpočtu asychronous (asynchronní objektu) bude čekat odpověď od agenta.

Poznámky

Zpráva je vygenerována použitím buildMessage nový kanál odpovědi by mělo být začleněno do zprávy.Přijímající agent musí tuto zprávu a přesně jednou vyvolat metodu odpovědět na tento kanál odpovědi.

Příklad

Následující příklad kódu ukazuje procesor agent poštovní schránky dané použití PostAndAsyncReply.Vrácená hodnota PostAndAsyncReply je asynchronní pracovní postup, který v tomto příkladu se spouští pomocí Async.StartWithContinuations, kód, který zpracovává odpovědi.

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();
                // Delay so that the responses come in a different order.
                do! Async.Sleep( 5000 - 1000 * n);
                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."

let isCompleted = false
while (not isCompleted) do
    printf "> "
    let input = Console.ReadLine()
    let messageAsync = agent.PostAndAsyncReply(fun replyChannel -> input, replyChannel)

    // Set up a continuation function (the first argument below) that prints the reply.
    // The second argument is the exception continuation (not used).
    // The third argument is the cancellation continuation (not used).
    Async.StartWithContinuations(messageAsync, 
         (fun reply -> printfn "%s" reply),
         (fun _ -> ()),
         (fun _ -> ()))

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

Následuje v relaci příklad.Výstup může interleaved, který prokazuje, že funkce zpracování zprávy běží na více podprocesů.

  
  
  
  
  
  
  
  
  
  

Platformy

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

Informace o verzi

F# základní verze knihovny

Podporovány: 2.0, 4.0, přenosné

Viz také

Referenční dokumentace

Control.MailboxProcessor < "Msg > Třídy (F#)

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