是否可以创建仅偶尔发布回复的邮箱代理? 从外观上看,在我看来,如果您想发布回复,您必须始终发送异步回复频道。
对于我的用例,我真的很希望能够灵活地将某些消息仅传递到代理,而其他消息我希望获得同步或异步回复。
我不确定我是否正确理解了这个问题 - 但您当然可以使用可区分的联合作为您的消息的一种类型。然后,您可以有一些包含AsyncReplyChannel<T>
的情况(消息类型)和一些不携带它(并且不需要回复)的其他消息。
例如,对于将数字相加的简单代理,您可以有Add
(不需要响应)和Get
确实需要响应。此外,Get
带有一个布尔值,该布尔值指定我们是否应将状态重置回零:
type Message =
| Add of int
| Get of bool * AsyncReplyChannel<int>
然后,代理重复接收消息,如果消息Get
则发送回复:
let counter = MailboxProcessor.Start(fun inbox ->
let rec loop count = async {
let! msg = inbox.Receive()
match msg with
| Add n -> return! loop (count + n) // Just update the number
| Get (reset, repl) ->
repl.Reply(count) // Reply to the caller
let count = if reset then 0 else count // get new state
return! loop count } // .. and continue in the new state
loop 0 )
然后,您可以使用Post
方法发送不需要回复的消息,PostAndReply
发送通过异步回复通道返回某些内容的消息:
counter.Post(Add 10)
counter.PostAndReply(fun r -> Get(true, r))
counter.PostAndReply(fun r -> Get(false, r))