Continuations:我可以在F#异步工作流程或C#异步功能中序列化延续吗?

时间:2011-07-27 04:53:31

标签: c# f# android-asynctask continuations

我想要一个可序列化的延续,这样我就可以在等待新事件时将异步工作流腌制到磁盘上。当异步工作流在let!上等待时,它将被保存起来并记录唤醒它所需的内容。例如,它必须是传入消息的过滤标准以及延续本身,而不是任意的内存中IAsyncResult(或Task<T>等)。没有语言支持延续,这可能是一个壮举。但是使用计算表达式来处理明确的CPS变换,它可能不会太棘手,甚至可能更有效。有人解决了这样的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用MailboxProcessorAgent类型作为接近您想要的方式。然后,您可以使用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

这可能是您想要的技术,假设事件/消息以小时/天/周的时间到达,并且您正在序列化到磁盘以避免在此期间使用内存/线程。 (或者你为什么要这样做?)