Aracılığıyla paylaş


MailboxProcessor.Receive<'Msg> Yöntemi (F#)

Bir ileti için bekler. Bu varış sırasındaki ilk iletiyi tüketir.

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

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

// Signature:
member this.Receive : ?int -> Async<'Msg>

// Usage:
mailboxProcessor.Receive ()
mailboxProcessor.Receive (timeout = timeout)

Parametreler

  • timeout
    Türü: int

    İsteğe bağlı milisaniye cinsinden zaman aşımı. Infinite'e karşılık gelir ve varsayılan olarak -1'dir.

Özel Durumlar

Özel Durum

Koşul

TimeoutException

Zaman aşımı aşıldığında oluşturulur.

Dönüş Değeri

Zaman uyumsuz bir hesaplama (zaman uyumsuz nesnesi), alınan ileti verir.

Notlar

Bu yöntem aracının gövdesi içinde kullanılır. Her aracı için en fazla eşzamanlı bir okuyucu etkin olabilir bu nedenle birden fazla eş zamanlı çağrı Receive, TryReceive, Tarama veya TryScan etkin olabilir.

Örnek

Aşağıdaki örnek, Receive metodunun nasıl kullanılacağını göstermektedir. Bu durumda, 10 saniyelik bir zaman aşımı belirtildi. Genel olarak, farklı bir iş parçacığından ileti işleme işlevi çalışır sonrası zaman aşımı özel durum iletisi işlemcisi işlevinde yakalamak için işlev. Bu örnekte, zaman aşımı özel durum yalnızca devam etmek döngü oluyor ve 1 ileti numarası artar.

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 {            
            try
                let! (message, replyChannel) = inbox.Receive(10000);

                if (message = "Stop") then
                    replyChannel.Reply("Stop")
                else
                    replyChannel.Reply(String.Format(formatString, n, message))
                do! loop (n + 1)

            with
            | :? TimeoutException -> 
                printfn "The mailbox processor timed out."
                do! loop (n + 1)
        }
    loop (0))

printfn "Mailbox Processor Test"
printfn "Type some text and press Enter to submit a message."
printfn "Type 'Stop' to close the program."


let rec loop() =
    printf "> "
    let input = Console.ReadLine()
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stop") then
        printfn "Reply: %s" reply
        loop()
    else
        ()
loop()

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

Tipik bir oturumu takip eder. Zaman aşımı nedeniyle bu ileti 2 atlanır dikkat edin.

  
  
  
  
  
  
  
  
  

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