使用 CompensateActivity 活动

CompensateActivity 活动触发对实现 ICompensatableActivity 接口的已完成活动的补偿。 只有实现 ICompensatableActivity 接口的活动才能获得补偿。 两个实现 ICompensatableActivity 接口的 Windows Workflow Foundation 现成可用的活动分别为 CompensatableTransactionScopeActivityCompensatableSequenceActivity。 还可以通过使用 ICompensatableActivity 接口编写支持补偿的自定义活动。

如果在外部可补偿活动中没有其他补偿代码,则不必使用 CompensateActivity 活动。 如果工作流中有未处理的异常,则会自动运行任何嵌套了成功完成的可补偿活动的代码。 只有在您需要非默认的补偿时,才应使用 CompensateActivity 活动。 默认补偿按与完成相反的顺序调用所有嵌套的 ICompensatableActivity 子级的补偿。 如果这不是所需的顺序,或者希望有选择地调用已完成的 ICompensatableActivity 子级的补偿,则应使用 CompensateActivity 活动。

备注

CompensateActivity 活动只能在 CompensationHandlerActivity 活动、CancellationHandlerActivity 活动或 FaultHandlerActivity 活动中使用。

通过允许您决定是否要补偿支持补偿的直接子活动,CompensateActivity 活动使您能够控制补偿过程。 如果在工作流中使用嵌套可补偿活动,则可以将 CompensateActivity 活动添加到补偿块或补偿活动的错误处理程序块中。 这使您的工作流可以对嵌套可补偿活动显式执行补偿。 指定要在 CompensateActivity 中补偿的可补偿活动,如果可补偿活动已成功提交,则将运行嵌套可补偿活动中的任何补偿代码。

如果要补偿多个嵌套可补偿活动,请为每个可补偿活动添加一个 CompensateActivity 活动。 但是,如果将 TargetActivityName 设置为与 CompensateActivity 活动关联的活动,则这会在支持补偿的所有成功完成的嵌套活动中触发补偿。 下面的示例演示一个包含 SequenceActivity 活动的工作流,该活动具有引用 SequenceActivityCompensateActivity 活动。

<SequenceActivity x:Name="sequenceActivity1">
    <CompensatableSequenceActivity x:Name="compensatableSequenceActivity1">
        <CompensatableSequenceActivity x:Name="compensatableSequenceActivity2">
            <CompensationHandlerActivity x:Name="compensationHandlerActivity2">
                <CodeActivity x:Name="Comp2Code" ExecuteCode="Comp2Code_ExecuteCode" />
            </CompensationHandlerActivity>
        </CompensatableSequenceActivity>
        <CompensationHandlerActivity x:Name="compensationHandlerActivity1">
            <CodeActivity x:Name="Comp1Code" ExecuteCode="Comp1Code_ExecuteCode" />
        </CompensationHandlerActivity>
    </CompensatableSequenceActivity>
    <ThrowActivity x:Name="throwActivity1" Fault="{ActivityBind Workflow1,Path=throwActivity1_Fault1}" FaultType="{x:Type p6:Exception}" xmlns:p6="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <FaultHandlersActivity x:Name="faultHandlersActivity1">
        <FaultHandlerActivity x:Name="faultHandlerActivity1" FaultType="{x:Type p8:Exception}" xmlns:p8="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <CompensateActivity x:Name="compensateActivity1" TargetActivityName="sequenceActivity1" />
        </FaultHandlerActivity>
    </FaultHandlersActivity>
</SequenceActivity>

ThrowActivity 活动中引发异常时,与 SequenceActivity 活动关联的 FaultHandlerActivity 活动处理该异常并调用 CompensateActivity 活动。 由于 CompensateActivity 活动引用 SequenceActivity 活动,因此对所有嵌套可补偿活动调用所有补偿处理程序。 在本例中,调用了两个 CompensatableSequenceActivity 活动的可补偿处理程序。

有关演示如何使用 CompensateActivity 活动的代码示例,请参见Using Compensation

请参见

参考

CompensateActivity
CompensationHandlerActivity
ICompensatableActivity
CompensatableSequenceActivity
CompensatableTransactionScopeActivity

概念

工作流中的错误处理
在工作流中使用补偿
使用 CompensatableSequenceActivity 活动
使用 CompensatableTransactionScopeActivity 活动
补偿概述
添加可补偿活动和补偿处理程序

其他资源

Compensation Sample
Windows Workflow Foundation 活动

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。