返回值
如果你將 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
,它阻止呼叫執行緒,直到處理器回覆。