返回值

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