Asynchronous 我可以有一个异步代理来侦听和响应2个事件吗?
我希望有一个代理,作为一个SMTP服务器,异步等待电子邮件和服务请求,以检索收到的电子邮件列表。代理的外观类似于:Asynchronous 我可以有一个异步代理来侦听和响应2个事件吗?,asynchronous,f#,agent,Asynchronous,F#,Agent,我希望有一个代理,作为一个SMTP服务器,异步等待电子邮件和服务请求,以检索收到的电子邮件列表。代理的外观类似于: let agent = Agent.Start(fun inbox -> let rec loop emails = async { let! email = ReceiveEmail() let emails = email::emails let! emailStatusRequest = inbox.Receive()
let agent = Agent.Start(fun inbox ->
let rec loop emails = async {
let! email = ReceiveEmail()
let emails = email::emails
let! emailStatusRequest = inbox.Receive()
match emailStatusRequest with
| Get channel -> channel.Reply emails
return! loop emails }
loop [])
这将等待电子邮件,然后等待状态请求。我将如何解耦排序,以便代理响应最先发生的事件-电子邮件接收事件或获取电子邮件的请求事件?
代理是否是对此建模的正确工具?我会将
接收电子邮件
部分移动到它自己的异步循环中,并让它向您的代理发送消息
类似这样的内容(警告:未测试-视为伪代码):
当然,您可能需要在
CancellationToken
上支持。。。你会明白的;) 我会将ReceiveEmail
部分移动到它自己的异步循环中,让它将消息发布到您的代理-显而易见的方法是让一些AgentCommand=Received of Message | StatusRequest of EmailStatusRequest |……
sum typeNice@Carsten。如果你加上你的评论作为回答,我会接受的。我有一个代理接收电子邮件,另一个代理记录电子邮件。我将其包装为一个类型,该类型仅公开一个获取接收到的电子邮件列表的方法。我似乎总是忘记代理可以与其他代理通信。。。
type AgentCommands =
| Received of Email
| StatusRequest of RequestParams
| ...
let agent = Agent.Start(fun inbox ->
let rec loop emails = async {
let! cmd = inbox.Receive
match cmd with
| Received email ->
let emails = email::emails
return! loop emails
| StatusRequest emailStatusRequest ->
match emailStatusRequest with
| Get channel -> channel.Reply emails
return! loop emails }
loop [])
let receiveLoop = async {
while true do
let! email = ReceiveEmail()
agent.Post (Received email)
} |> Async.Start