Udostępnij za pośrednictwem


MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> — Metoda (F#)

Publikuje komunikat do agenta i czeka na odpowiedź na kanale, asynchronicznie.

Przestrzeń nazw/Ścieżka modułu: Microsoft.FSharp.Control

Zestaw: FSharp.Core (w 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

    Funkcja służąca do dołączania obiektu AsyncReplyChannel do wysyłanego komunikatu.

  • timeout
    Typ: int

    Opcjonalny parametr limitu czasu (w milisekundach) oczekiwania na komunikat odpowiedzi.Wartość domyślna to -1, co odpowiada wartości Infinite.

Wartość zwracana

Obliczenie asynchroniczne (obiekt Async), które będzie oczekiwać na odpowiedź od agenta.

Uwagi

Komunikat jest generowany przez zastosowanie metody buildMessage do nowego kanału odpowiedzi, który należy dołączyć do komunikatu.Agent odbierający musi przetworzyć ten komunikat i wywoływać metodę Reply w tym kanale odpowiedzi dokładnie jeden raz.

Przykład

W poniższym przykładzie kodu pokazano agenta procesora skrzynki pocztowej używającego metody PostAndAsyncReply.Wartość zwracana przez metodę PostAndAsyncReply to asynchroniczny przepływ pracy, który w tym przykładzie rozpoczyna się od użycia metody Async.StartWithContinuations w celu skonfigurowania kodu obsługującego odpowiedź.

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

Poniżej pokazano przykładową sesję.Dane wyjściowe mogą być przemieszane, co pokazuje, że funkcja przetwarzania komunikatów działa w wielu wątkach.

                    

Platformy

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

Informacje o wersji

Wersje podstawowej biblioteki języka F#

Obsługiwane przez: 2.0, 4.0, przenośne

Zobacz też

Informacje

Control.MailboxProcessor<'Msg> — Klasa (F#)

Microsoft.FSharp.Control — Przestrzeń nazw (F#)