Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 我可以有一个异步代理来侦听和响应2个事件吗?_Asynchronous_F#_Agent - Fatal编程技术网

Asynchronous 我可以有一个异步代理来侦听和响应2个事件吗?

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()

我希望有一个代理,作为一个SMTP服务器,异步等待电子邮件和服务请求,以检索收到的电子邮件列表。代理的外观类似于:

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