返回值

如果你將 AsyncReplyChannel<'a> 作為訊息的一部分傳送,則可以非同步返回每個已處理訊息的值。

type MessageWithResponse = Message of InputData * AsyncReplyChannel<OutputData>

然後郵箱處理器可以在處理訊息時使用此通道將值傳送回撥用方。

let! message = inbox.Receive()
match message with
| MessageWithResponse (data, r) ->
    // ...process the data
    let output = ...
    r.Reply(output)

現在要建立一條訊息,你需要 AsyncReplyChannel<'a> - 它是什麼以及如何建立一個工作例項?最好的方法是讓 MailboxProcessor 為你提供它並將響應提取到更常見的 Async<'a>。這可以通過使用例如 PostAndAsynReply 方法來完成,其中你不釋出完整的訊息,而是釋出型別的函式(在我們的例子中)AsyncReplyChannel<OutputData> -> MessageWithResponse

let! output = processor.PostAndAsyncReply(r -> MessageWithResponse(input, r))

這將在佇列中釋出訊息並等待回覆,一旦處理器到達此訊息並使用該通道回覆,該回復將到達。

還有一個同步變數 PostAndReply,它阻止呼叫執行緒,直到處理器回覆。