Udostępnij za pośrednictwem


MailboxProcessor.PostAndAsyncReply < "Msg," odpowiedzi > Metoda (F#)

Ogłoszenia wiadomości agenta i poczekać na odpowiedź na kanale, asynchronicznie.

Ścieżka obszaru nazw/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 włączenie AsyncReplyChannel do wysłanie wiadomości.

  • timeout
    Typ: int

    Parametr opcjonalny limit czasu (w milisekundach) oczekiwania na odpowiedź.Wartością domyślną jest -1, która odpowiada Infinite.

Wartość zwracana

Asychronous obliczeń (Async obiektu), czeka na odpowiedź od agenta.

Uwagi

Wiadomość jest generowany przez zastosowanie buildMessage do nowego kanału odpowiedzi, należy włączyć do wiadomości.Zleceniodawca musi przetworzyć tej wiadomości i dokładnie raz wywołać metodę odpowiedzi na ten kanał odpowiedzi.

Przykład

Poniższy przykład kodu pokazuje agenta procesora skrzynki pocztowej, że używa PostAndAsyncReply.Wartość zwracana przez PostAndAsyncReply jest asynchroniczne przepływu pracy, który w tym przykładzie jest uruchamiany przy użyciu Async.StartWithContinuations, aby zdefiniować kod, który obsługuje odpowiedzi.

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

Oto przykład sesji.Dane wyjściowe mogą przeplotu, pokazuje, że funkcja przetwarzania wiadomości jest uruchomiona na wiele wątków.

  
  
  
  
  
  
  
  
  
  

Platformy

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

Informacje o wersji

F# Core wersji biblioteki

Obsługiwane: 2.0, 4.0, przenośne

Zobacz też

Informacje

Control.MailboxProcessor < "Msg > Klasa (F#)

Obszar nazw Microsoft.FSharp.Control (F#)