Windows工作流程4:WorkflowApplication取消,终止和中止之间的区别

时间:2010-07-19 14:20:52

标签: workflow-foundation-4

任何人都可以解释以下WorkflowApplication方法之间的区别:

中止 取消 终止

2 个答案:

答案 0 :(得分:31)

在进一步调查此问题后,我想总结一下差异:

终止:

  • 将触发工作流应用程序的已完成事件
  • CompletionState(WorkflowApplicationCompletedEventArgs)是Faulted
  • 将触发工作流应用程序的Unloaded事件
  • 工作流程完成
  • OnBodyCompleted on the activity将被称为

取消:

  • 将触发工作流应用程序的已完成事件
  • CompletionState(WorkflowApplicationCompletedEventArgs)已取消
  • 将触发工作流应用程序的Unloaded事件
  • 工作流程完成
  • OnBodyCompleted on the activity将被称为

中止:

  • 将触发工作流应用程序的Aborted事件
  • 工作流程未完成

未处理的异常

  • 触发OnUnhandledException
  • 在这个eventhandler中,返回值(类型为UnhandledExceptionAction)决定了接下来会发生什么:
  • UnhandledExceptionAction.Terminate将终止工作流实例
  • UnhandledExceptionAction.Cancel将取消工作流实例
  • UnhandledExceptionAction.Abort将中止工作流实例
  • 每个都会触发上述相应的事件

更新: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

  1. 在中止时,a)活动立即停止,b)调用中止处理程序,c)已完成处理程序被调用。
  2. 在取消时,a)活动被给予一个宽限期以便优雅地停止,之后抛出TimeoutException,b)调用已完成的处理程序。
  3. 在终止时,a)活动被给予宽限期以便优雅地停止,之后抛出TimeoutException,b)调用已完成的处理程序。
  4. Abort和Cancel / Terminate之间的区别非常惊人。只需致电Abort直接杀死工作流程。取消和终止之间的区别更加细微。取消不需要任何理由(它是一个无参数的无方法),而终止需要一个原因(以字符串或异常格式)。

    在所有情况下,工作流运行时将代表您执行任何隐式操作(即工作流不会自动破坏la WF3.5 Terminate)。但是,通过运行时公开的高度可自定义的异常\事件处理,可以相对轻松地实现任何此类功能。


    <强> WF3.5

    <强>取消

    根据Msdn documentation

      

    活动由父活动明确地置于Canceling状态,或者因为在执行该活动期间抛出了异常。

    虽然取消可用于停止整个工作流(即在根活动上调用),但它通常用于停止工作流的离散部分(即,作为错误恢复或对父部分的显式操作)。简而言之,取消是工作流控制流的一种手段。

    中止并终止

    再次,根据Msdn documentation

      

    Abort与Terminate的不同之处在于,Abort只是清除内存中的工作流实例,并且可以从上一个持久性点重新启动,Terminate清除内存中的工作流实例,并通知持久性服务实例已从中清除记忆。对于SqlWorkflowPersistenceService,这意味着终止时将从数据库中删除该工作流实例的所有状态信息。您将无法从先前存储的持久性点重新加载工作流实例。

    这本身就很清楚。 Abort仅停止内存中执行,而Terminate停止内存执行会破坏任何持久状态。