Я хотел бы иметь агента, который действует как SMTP-сервер, который асинхронно ждет сообщений электронной почты, а также запросы служб для получения списка полученных электронных писем. Агент будет выглядеть примерно так:Могу ли я иметь асинхронный агент, который слушает и отвечает на 2 события?
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 [])
Это будет ждать сообщения электронной почты, а затем ждать запроса статуса. Как мне отделить заказ, чтобы агент реагировал на то, какое событие происходит первым - событие, полученное по электронной почте, или запрос на получение сообщения электронной почты? Является ли агент идеальным инструментом для моделирования этого?
I переместит часть 'ReceiveEmail' в свой собственный асинхронный цикл и отправит сообщения вашему агенту - очевидным способом является наличие некоторого' AgentCommand = Received of Message ' StatusRequest EmailStatusRequest | ... 'sum-type – Carsten
Nice @Carsten. Если вы добавите свой комментарий в качестве ответа, я соглашусь с ним. У меня есть один агент для получения писем, а другой - для записи их. Я обертываю это типом, который только предоставляет метод для получения списка полученных сообщений электронной почты. Я всегда забываю, что агенты могут общаться с другими агентами ... – NickL