Aracılığıyla paylaş


MailboxProcessor.PostAndAsyncReply<'Msg,'Reply> Yöntemi (F#)

Aracıya bir ileti gönderir ve zaman uyumsuz olarak kanal üzerinde bir cevap bekler.

Ad alanı/modül yolu: Microsoft.FSharp.Control

Derleme: FSharp.Core (FSharp.Core.dll),

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

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

Parametreler

  • buildMessage
    Türü: AsyncReplyChannel<'Reply> -> 'Msg

    Gönderilecek iletiye AsyncReplyChannel eklemek için işlev.

  • timeout
    Türü: int

    Bir yanıt iletisi için beklenecek isteğe bağlı zaman aşımı parametresi (milisaniye cinsinden). Karşılık gelen -1 varsayılandır Infinite.

Dönüş Değeri

Asychronous hesaplaması (zaman uyumsuz nesnesi) aracısı cevabı için bekler.

Notlar

İleti, mesaja eklemek üzere yeni bir yanıt kanalına buildMessage uygulayarak oluşturulur. Alıcı aracı bu iletiyi işlemeli ve tam olarak bir kez bu yanıt kanalındaki Reply yöntemini çağırmalıdır.

Örnek

Aşağıdaki kod örneği, kullandığı bir posta kutusu işlemci Aracısı gösterir PostAndAsyncReply. Dönüş değeri PostAndAsyncReply , bu örnekte kullanılarak başlatılan zaman uyumsuz bir iş akışıdır Async.StartWithContinuations, yanıt işleyen kodu ayarlamak için.

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

Aşağıdaki örnek bir oturumdur. Çıktı, ileti işleme işlevi birden çok iş parçacığı üzerinde çalıştığını gösterir Aralanmış.

  
  
  
  
  
  
  
  
  
  

Platformlar

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

Sürüm Bilgisi

F# Çekirdek Kitaplığı sürümleri

Desteklenen: 2.0, 4.0, Portable

Ayrıca bkz.

Başvuru

Control.MailboxProcessor<'Msg> Sınıfı (F#)

Microsoft.FSharp.Control İsim Uzayı (F#)