我想要一个可序列化的延续,这样我就可以在等待新事件时将异步工作流腌制到磁盘上。当异步工作流在let!
上等待时,它将被保存起来并记录唤醒它所需的内容。例如,它必须是传入消息的过滤标准以及延续本身,而不是任意的内存中IAsyncResult
(或Task<T>
等)。没有语言支持延续,这可能是一个壮举。但是使用计算表达式来处理明确的CPS变换,它可能不会太棘手,甚至可能更有效。有人解决了这样的方法吗?
答案 0 :(得分:1)
您可以使用MailboxProcessor
或Agent
类型作为接近您想要的方式。然后,您可以使用agent.PostAndAsyncReply
超时来检索当前AgentState
。如上所述,您需要使您传递的对象可序列化,但即使是委托也是可序列化的。但内部实际上与async
计算无关。 async
计算只会让您以非阻塞的方式与程序中的各种代理进行交互。
Dave Thomas我一直在开发一个名为fracture-io的库,它将提供一些与代理一起使用的开箱即用的方案。我们还没有讨论过这个确切的场景,但我们可能会考虑将其烘焙...或者提交。 :)
我还注意到您使用callcc
标记了您的问题。我将该运算符的样本发布到fssnip,但Tomas Petricek很快posted an example打破async
计算是多么容易。所以我不认为callcc
是这个问题的有用解决方案。如果您不需要async
,则可以在FSharpx中查找Continuation
模块和callcc
运算符。
答案 1 :(得分:0)
你看过Windows Workflow Foundation吗?
http://msdn.microsoft.com/en-us/netframework/aa663328.aspx
这可能是您想要的技术,假设事件/消息以小时/天/周的时间到达,并且您正在序列化到磁盘以避免在此期间使用内存/线程。 (或者你为什么要这样做?)