【问题标题】:Continuations: can I serialize the continuation in an F# async workflow or C# async function?延续:我可以在 F# 异步工作流或 C# 异步函数中序列化延续吗?
【发布时间】:2011-10-13 22:50:40
【问题描述】:

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

【问题讨论】:

  • 你能提供一个例子来描述你在寻找什么吗?
  • async { let! x = GetSimulationStartTime(); let! y = GetSimulationStopTime(); return! y-x } 怎么样,开始和停止可能相隔几天,我不想显式建模状态机 type AgentState = WaitingForStart | WaitingForEnd | Completed
  • AFAIK 甚至没有现成的选项来序列化 Qutoations/Expressions - 对于延续的一般情况(您可能会在闭包中捕获很多内容),您无法获得此选项.想想看——无论如何你都需要一种序列化每个对象的方法。如果您真的需要它,可以自己实现它(您可以使用将 ISerializable 等待状态保存到磁盘的选项自己重写异步工作流) - 或者像其他答案中提到的那样真正查看 WF。

标签: c# f# android-asynctask continuations


【解决方案1】:

您可能会使用MailboxProcessorAgent 类型来接近您想要的内容。然后,您可以使用带有超时的agent.PostAndAsyncReply 来检索当前的AgentState。如上所述,您需要使传递的对象可序列化,但即使委托也是可序列化的。不过,内部实际上与async 计算无关。 async 计算仅允许您以非阻塞方式与程序中的各种代理进行交互。

Dave Thomas 和我一直在开发一个名为 fracture-io 的库,它将为与代理一起工作提供一些开箱即用的场景。我们还没有讨论过这个确切的场景,但我们可能会考虑将其烘焙到......或提交。 :)

我还注意到您用callcc 标记了您的问题。我将该运算符的示例发布到 fssnip,但 Tomas Petricek 很快 posted an example 就知道用 async 计算破解是多么容易。所以我不认为callcc 是解决这个问题的有用解决方案。如果不需要async,可以在FSharpx 中查找Continuation 模块和callcc 运算符。

【讨论】:

  • 既然MailboxProcessor/Agent 确实是这里的想法,我很受鼓舞,但我承认我并没有完全遵循。代理的内部状态必须被序列化为委托(您注意到这是可能的)以及再次唤醒它的标准(即它等待的消息)。
  • 所以你需要一些方法来再次检查每个项目,对吗?那应该不难。您基本上遵循 CanExecute 和 Execute 委托的命令模式。我会去找戴夫,看看我们能不能很快解决这个问题。
  • 如果我能完全理解它,我很乐意与你们一起工作。虽然根本的弱点可能是序列化委托意味着没有工作流可以比应用程序的新部署持续更长时间,因为延续的结构可能会完全改变。
【解决方案2】:

您看过 Windows Workflow Foundation 吗?

http://msdn.microsoft.com/en-us/netframework/aa663328.aspx

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

【讨论】:

  • 也许判断太仓促了,但我对猫和 XML 过敏。这些工作流程更有可能持续几秒钟或几分钟,但几小时和几天就足够常见了。在许多情况下,每个事件要完成的工作很小,但整体“状态机”足够复杂,使用异步工作流会很好,即简单的编程而不是手工构建的状态机或 XML 乐高积木。另外,我不介意在 Mono 下运行。
  • 在我看来,“工作流”这个词不适合异步。我宁愿只在我做一些我想异步执行的 IO 操作时才使用异步,而不是使用它们来实现“工作流”,因为你可以有其他更好的抽象来表示工作流
  • 我从未真正使用过 Workflow Foundation,但我想知道是否可以在 F# 中编写一个包含 Workflow Foundation 的自定义计算表达式构建器,或许可以消除对 XML 的需求?
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2019-05-22
  • 2018-08-01
相关资源
最近更新 更多