Continuations: can I serialize the continuation in an F# async workflow or C# async function?
I want a serializable continuation so I can pickle async workflows to disk while waiting for new events. When the async workflow is waiting on a let!
, it would be saved away along with a record of what was needed to wake it up. Instead of arbitrary in-memory IAsyncResult
s (or Task<T>
, etc.), it would have to be, for instance, a filter criterion for incoming messages along with the continuation itself. Without language support for continuations, this might be a feat. But with computation expressions taking care of the explicit CPS tranformation, it might not be too tricky and could even be more efficient. Has anyone tackled an approach like this?
You could probably use the MailboxProcessor
, or Agent
, type as a means of getting close to what you want. You'd could then use the agent.PostAndAsyncReply
with a timeout to retrieve the current AgentState
. As mentioned above, you'll need to make the objects you are passing around serializable, but even delegates are serializable. The internals are really unrelated to async
computations, though. The async
computation would merely allow you a way to interact with the various agents in your program in a non-blocking fashion.
Dave Thomas and I have been working on a library called fracture-io that will provide some out-of-the-box scenarios for working with agents. We hadn't yet discussed this exact scenario, but we could probably look at baking this in ... or take a commit. :)
I also noticed that you tagged your question with callcc
. I posted a sample of that operator to fssnip, but Tomas Petricek quickly posted an example of how easy it is to break with async
computations. So I don't think callcc
is a useful solution for this question. If you don't need async
, you can look in FSharpx for the Continuation
module and the callcc
operator in there.
Have you looked at Windows Workflow Foundation?
http://msdn.microsoft.com/en-us/netframework/aa663328.aspx
That's probably the technology you want, assuming the events/messages are arriving in periods of hours/days/weeks and you're serializing to disk to avoid using memory/threads in the meantime. (Or else why do you want it?)
精彩评论