Compartir a través de


Uso de la actividad CompensateActivity

La actividad CompensateActivity activa la compensación de una actividad finalizada que implementa la interfaz ICompensatableActivity. Solo se pueden compensar actividades que implementan la interfaz ICompensatableActivity. Las dos actividades originales Windows Workflow Foundation que implementan la interfaz ICompensatableActivity son CompensatableTransactionScopeActivity y CompensatableSequenceActivity. También puede escribir actividades personalizadas que admiten la compensación mediante la interfaz ICompensatableActivity.

No tiene que utilizar una actividad CompensateActivity si no hay ningún otro código de compensación en una actividad compensable exterior. El código de compensación de cualquier actividad compensable, correctamente completada y anidada se ejecuta automáticamente si hay una excepción no controlada en el flujo de trabajo. Debería utilizar solo la actividad CompensateActivity si necesita algo diferente a la compensación predeterminada. La compensación predeterminada invoca la compensación de todos los elementos secundarios ICompensatableActivity anidados en el orden inverso a su realización. Si esta clasificación no es lo que necesita, o si desea invocar selectivamente la compensación de elementos secundarios ICompensatableActivity completados, debería utilizar la actividad CompensateActivity.

Nota

La actividad CompensateActivity solamente se puede usar en una actividad CompensationHandlerActivity, CancellationHandlerActivity o FaultHandlerActivity.

La actividad CompensateActivity le da control sobre el proceso de compensación; para ello le deja decidir si desea compensar una actividad secundaria inmediata que admite compensación. Si utiliza actividades compensables anidadas en su flujo de trabajo, puede agregar una actividad CompensateActivity en el bloque de compensación o un bloque faulthandler de una actividad compensable. Esto le permite a su flujo de trabajo realizar explícitamente la compensación en una actividad compensable anidada. Especifique qué actividad compensable desea compensar en CompensateActivity, y se ejecutará cualquier código de compensación en la actividad compensable anidada, con tal de que la actividad compensable confirmara correctamente.

Si desea compensar más de una actividad compensable anidada, agregue una actividad CompensateActivity para cada actividad compensable. Sin embargo, si TargetActivityName está establecido en una actividad asociada a la actividad CompensateActivity entonces se realizará la compensación en todas las actividades anidadas finalizadas correctamente que admiten compensación. El ejemplo siguiente muestra un flujo de trabajo con una actividad SequenceActivity que tiene una actividad CompensateActivity que hace referencia a SequenceActivity.

<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>

Cuando desde una actividad ThrowActivity se produce una excepción, la actividad FaultHandlerActivity asociada con la actividad SequenceActivity administra la excepción y llama a la actividad CompensateActivity. Dado que la actividad CompensateActivity hace referencia a la actividad SequenceActivity, se llama a todos los controladores de compensación en todas las actividades compensables anidadas. En este caso, se llama a los controladores compensables para ambas actividades CompensatableSequenceActivity.

Si quiere ver un ejemplo de código que muestra cómo utilizar la actividad CompensateActivity, consulte Using Compensation.

Consulte también

Referencia

CompensateActivity
CompensationHandlerActivity
ICompensatableActivity
CompensatableSequenceActivity
CompensatableTransactionScopeActivity

Conceptos

Control del error en flujos de trabajo
Uso de la compensación en flujos de trabajo
Utilización de la actividad CompensatableSequenceActivity
Uso de la actividad CompensatableTransactionScopeActivity
Información general de compensación
Agregar actividades compensables y controladores de compensación

Otros recursos

Compensation Sample
Actividades de Windows Workflow Foundation

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.