Windows工作流 - PersistableIdle

use*_*292 5 .net workflow persist

在我们公司,我们有一个业务流程需要:

  1. 从X获取数据
  2. 等待用户Y进行研究
  3. 根据第2步数据从Z获取数据

在研究这个问题时,似乎有一些选项可以在工作流程中实现这一点.

  1. 在步骤1(工作流程活动)和步骤3(工作流程活动)之间添加延迟活动.然后在PersistableIdle事件期间,卸载worklow.当用户完成步骤2时,从数据库重新加载工作流程.
  2. 与#1相同,但使用书签而不是延迟活动.

是否有更好的approch(1,2或另一种选择)?

我们所有的其他活动都是AsyncCodeActivities,所以我很确定它们不会触发PersistableIdle事件(因为它们处于无持久区域),但我想确保在其他情况下不会意外卸载工作流.这里有风险吗?反正有没有创建一个强制工作流卸载的活动?

Tim*_*ith 5

有更好的方法(1,2或另一种选择)?

乍一看,#2听起来很有必要.使用书签(或某种书签活动,如接收)的原因是它们可以随时恢复.这允许用户Y的研究结束,并且工作流程可以随时恢复执行(而不是在延迟到期之前被阻止).

#1可能也是必要的反驳是,您可能希望设置触发工作流操作的时间限制(提醒被触发,例外,取消等).

怎么决定?我认为答案通常是#3:两者

使用Pick Activity是一种很好的方法.在一个PickBranch触发器中使用书签活动,在另一个PickBranch触发器中使用延迟活动,您可以编写一个工作流程,该工作流程将"处理先发生者 - 用户Y或超时".

您提出的第二个问题是"当我不希望工作流程被卸载时,如何停止卸载工作流程?"是否意外的工作流程正在卸载风险?

嗯,这取决于.如果您使用的WorkflowServiceHost中,让您的工作流程卸载不觉得自己是一个很大的风险,因为WorfklowServiceHost是足够聪明,刷新你的工作流程时,它需要做更多的工作(处理传入的消息,或延迟恢复).

如果你不使用WorkflowServiceHost中,你很可能编写你的主机,你可以实现与一些工作一样的效果,或者你可以防止发生过卸载 - 当你写的主机,你控制卸载政策,通过事件在WorkflowApplication上

其他杂项: - 异步代码活动确实会阻止您的工作流在进行异步工作时保持不变.我不认为它们应该被故意用作反持久机制 - 如果你想要其中之一,请查看NoPersistZone活动.

- 没有'卸载'活动,但有一个'持久'活动.工作流可以说他们想要保存进度,但只有主机才能在卸载发生时做出最终决定.