Aracılığıyla paylaş


MailboxProcessor.TryReceive<'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 içinde)

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

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

Parametreler

  • timeout
    Aşağıdakini yazın: int

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

Dönüş Değeri

Zaman uyumsuz bir hesaplama (zaman uyumsuz nesnesi), alınan iletiyi döndürür veya None zaman aşımı aşılırsa.

Açıklamalar

Bu yöntem aracının gövdesi içinde kullanılır. Döndürür None bir zaman aşımı verilir ve zaman aşımı ortaya. 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ı Al, TryReceive, Tarama veya TryScan etkin olabilir.

Örnek

Aşağıdaki örnek, nasıl kullanılacağını gösterir TryReceive. Bir ileti 10 saniye içinde alınmazsa, ileti kimliği 1 artar ve bir zaman aşımı oluşur.

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! opt = inbox.TryReceive(10000);
                match opt with
                | None -> do! loop(n + 1)
                | Some (message, replyChannel) ->
                    // The delay gets longer with each message, and eventually triggers a timeout.
                    if (message = "Stop") then
                        replyChannel.Reply("Stop")
                    else
                        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."
printfn "Type 'Stop' to close the program."

let mutable isCompleted = false
while (not isCompleted) do
    printf "> "
    let input = Console.ReadLine()
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stop") then
        printfn "Reply: %s" reply
    else
        isCompleted <- true

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

Örnek oturumunda aşağıdaki gibidir. İleti numarası 2 zaman aşımı nedeniyle atlanır dikkat edin.

              

Platformlar

Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2

Sürüm Bilgisi

F# Çalışma Zamanı

Desteklenir: 2.0, 4.0

Silverlight

Desteklenir: 3

Ayrıca bkz.

Başvuru

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

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

Değişiklik Geçmişi

Tarih

Geçmiş

Nedeni

Ocak 2011

Eklenen kod örneği.

Bilgi geliştirme.