返回值
如果你将 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
,它阻止调用线程,直到处理器回复。