任何人都可以解释以下WorkflowApplication方法之间的区别:
中止 取消 终止
答案 0 :(得分:31)
在进一步调查此问题后,我想总结一下差异:
终止:
取消:
中止:
未处理的异常
更新:Abort似乎没有触发SQL持久性存储中的实例卸载。所以在我看来,你最好使用Cancel或Terminate,如果你必须根据完成状态执行某些操作,你可以在Complete事件中检查CompletionState。
答案 1 :(得分:15)
首先,向Steffen Opel致敬(及其下面的评论)。我没有发现原帖linked documentation具体WF 3.5。多做了一点。
为了后人的缘故,我在下面留下了我之前的回复,标记为 WF3.5 。有关WF4.0中取消,中止和终止的一些注意事项,请参阅 WF4.0 。
<强> WF4.0 强>
不幸的是,很少有明确的文档讨论WF4.0中取消,中止和终止的差异。但是,来自member method documentation,
Abort和Cancel / Terminate之间的区别非常惊人。只需致电Abort直接杀死工作流程。取消和终止之间的区别更加细微。取消不需要任何理由(它是一个无参数的无方法),而终止需要一个原因(以字符串或异常格式)。
在所有情况下,工作流运行时将不代表您执行任何隐式操作(即工作流不会自动破坏la WF3.5 Terminate)。但是,通过运行时公开的高度可自定义的异常\事件处理,可以相对轻松地实现任何此类功能。
<强> WF3.5 强>
<强>取消强>
活动由父活动明确地置于Canceling状态,或者因为在执行该活动期间抛出了异常。
虽然取消可用于停止整个工作流(即在根活动上调用),但它通常用于停止工作流的离散部分(即,作为错误恢复或对父部分的显式操作)。简而言之,取消是工作流控制流的一种手段。
中止并终止
再次,根据Msdn documentation
Abort与Terminate的不同之处在于,Abort只是清除内存中的工作流实例,并且可以从上一个持久性点重新启动,Terminate清除内存中的工作流实例,并通知持久性服务实例已从中清除记忆。对于SqlWorkflowPersistenceService,这意味着终止时将从数据库中删除该工作流实例的所有状态信息。您将无法从先前存储的持久性点重新加载工作流实例。
这本身就很清楚。 Abort仅停止内存中执行,而Terminate停止内存执行和会破坏任何持久状态。