Sdílet prostřednictvím


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

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

Obor názvů/Cesta modulu: 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
    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

Asynchronní výpočet (objekt Async), který bude očekávat 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 agent procesoru poštovní schránky, který používá parametr PostAndAsyncReply.Vrácená hodnota parametru PostAndAsyncReply je asynchronní pracovní postup, který se v tomto příkladu spouští pomocí parametru Async.StartWithContinuations pro nastavení kódu, který odpověď zpracovává.

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 příkladová relace.Výstup může být prokládaný, což znamená, že funkce zpracování zprávy je spuštěna na několika vláknech.

                    

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#)