クラスを介して F# でエージェントの操作を開始しようとしてMailboxProcessor<'Msg>
いますが、例外を適切に処理していないことにすぐに気付きました。Haskelly の世界では、例外は存在しないため、問題を処理する適切な方法は、単純に応答ケースとして提供することです。そのため、エージェントは次のように返信できます。
type AgentResponse =
| HandledData of string
| InvalidData of string
.PostAndReply
その後、エージェントのメソッドを呼び出してInvalidData
、データが無効である理由を示すメッセージを含む を取得できます。ただし、これは Haskell ではないため、例外が発生することがあります。だから私がこれを行うと:
let agent =
new MailboxProcessor<string * AsyncReplyChannel<AgentResponse>>(fun inbox ->
async {
while true do
let! (msg, replyChannel) = inbox.Receive()
if msg = "die" then failwith "Unknown exception encountered!"
else replyChannel.Reply(HandledData(msg))
})
agent.Start()
agent.PostAndReply (fun rc -> "die", rc)
agent.PostAndReply (fun rc -> "Test", rc)
2 回目の呼び出しはagent.PostAndReply
無期限にブロックします。を使用せずに呼び出すAsyncReplyChannel
だけagent.Post
の場合、呼び出しはブロックされませんが、エージェントが例外に遭遇すると、新しいメッセージはキューに残ります。どちらの場合も、エージェントを再起動することは不可能に見えます。agent.Start
関数が再度呼び出されたときに を返すためInvalidOperationException
です。これを処理する自然な方法は、クリーンな状態で新しいエージェントを作成することですが、キューに入れられたすべてのメッセージが失われます。
エージェントの本体全体を でラップするだけでなくtry..with
、例外の後もエージェントを実行し続けるための良い方法はありますか? あるいは、これに対処する「標準的な」方法が確立されており、誰かが私を指摘できますか?