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