《WF编程》系列之24 - 基本活动:SuspendActivity & TerminateActivity & ThrowActivity
2 min read

《WF编程》系列之24 - 基本活动:SuspendActivity & TerminateActivity & ThrowActivity

4.1.5 SuspendActivity

当工作流遇到错误而需要手工干预时,我们可以使用Suspend活动来暂时挂起工作流. Suspend活动有一个字符串类型的Error属性.

宿主可以订阅工作流Runtime的WorkflowSuspended事件并通过其事件参数(WorkflowSuspendedEventArgs类型)的Error属性来获取错误信息. WorkflowSuspended事件参数还提供了一个WorkflowInstance属性.宿主可以使用WorkflowInstance类的Resume方法来使工作流恢复执行,也可以使用Terminate方法使工作流悲惨的提前结束.

4.1.6 TerminateActivity

和Suspend活动相似,Terminate活动也可以挂起工作流.不同的是,使用Terminate挂起的工作流是无法被宿主恢复执行的(从单词含义来理解会更加容易:Suspend,暂停;Terminate,终止).如果工作流已经执行到不可能继续(也不可能恢复)的地步,就让我们用这个活动来结束它吧.

Terminate活动也有一个字符串类型的Error属性.宿主可以订阅Runtime的WorkflowTerminated事件.事件处理程序参数(WorkflowTerminatedEventArgs类型)的属性Exception(WorkflowTerminatedException类型)则包含了错误信息.

如果想要指定引发WorkflowTerminated事件的异常类型,应该使用Throw活动.Throw活动可以使工作流捕捉到异常并继续执行,而Terminate活动则总是抛出异常并终止工作流.

4.1.7 ThrowActivity

Throw活动和C#中的Throw语句类似-它的作用是抛出一个异常.我们可以在Code活动的ExcuteCode事件中编写代码来抛出异常,那么为什么要使用Throw活动呢? 因为Throw活动不仅可以抛出异常,还可以在工作流模型中构造一个显式的异常块.

如果异常没有被处理并且传播到工作流之外,那么WF Runtime将捕获它,接着终止工作流并抛出WorkflowTerminated事件.Runtime会在WorkflowTerminated事件的参数中包含异常的信息.Throw活动的Fault属性可以引用要抛出的异常类型.我们可以绑定Fault属性到工作流的域或其它活动的属性.

我们还可以使用FaultType属性来描述并约束待抛出异常的类型.如果FaultType没有被设置,Throw活动可能抛出任何类型的异常.