Utilisation de l'activité CompensateActivity

L'activité CompensateActivity déclenche la compensation d'une activité terminée qui implémente l'interface ICompensatableActivity. Seules les activités qui implémentent l'interface ICompensatableActivity peuvent être compensées. Les deux activités prédéfinies de Windows Workflow Foundation qui implémentent l'interface ICompensatableActivity sont CompensatableTransactionScopeActivity et CompensatableSequenceActivity. Vous pouvez également écrire des activités personnalisées qui prennent en charge la compensation à l'aide de l'interface ICompensatableActivity.

Vous n'avez pas besoin d'utiliser une activité CompensateActivity si aucun autre code de compensation ne se trouve dans une activité compensable externe. Le code de compensation de toutes les activités imbriquées compensables exécutées avec succès est exécuté automatiquement si est une exception non prise en charge se produit dans le workflow. Vous ne devez utiliser l'activité CompensateActivity que lorsque vous avez besoin d'autre chose que de la compensation par défaut. La compensation par défaut appelle la compensation de toutes les activités imbriquées ICompensatableActivity enfants dans l'ordre inverse de leur achèvement. Si ce classement ne correspond pas à vos besoins, ou vous souhaitez appeler sélectivement la compensation d'activités ICompensatableActivity enfants terminées, vous devez utiliser l'activité CompensateActivity.

NoteRemarque :

L'activité CompensateActivity ne peut être utilisée que dans une activité CompensationHandlerActivity, dans une activité CancellationHandlerActivity ou dans une activité FaultHandlerActivity.

L'activité CompensateActivity vous donne le contrôle sur le processus de compensation en vous permettant de décider si vous souhaitez compenser une activité enfant immédiate qui prend en charge la compensation. Si vous utilisez des activités compensables imbriquées dans votre workflow, vous pouvez ajouter une activité CompensateActivity dans le bloc de compensation ou dans un bloc FaultHandler d'activité compensable. Cela permet à votre workflow d'effectuer explicitement la compensation d'une activité compensable imbriquée. Spécifiez l'activité compensable à compenser dans CompensateActivity ; le code de compensation contenu dans l'activité compensable imbriquée est alors exécuté, sous réserve que l'activité compensable ait été validée.

Si vous souhaitez compenser plusieurs activités compensables imbriquées, ajoutez une activité CompensateActivity pour chaque activité compensable. Toutefois, si TargetActivityName a pour valeur une activité associée à l'activité CompensateActivity, cela déclenche la compensation de toutes les activités imbriquées achevées qui prennent en charge la compensation. L'exemple suivant illustre un workflow avec une activité SequenceActivity qui contient une activité CompensateActivity faisant référence à l'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>

Lorsqu'une exception est levée à partir de l'activité ThrowActivity, l'activité FaultHandlerActivity associée à l'activité SequenceActivity gère l'exception et appelle l'activité CompensateActivity. L'activité CompensateActivity fait référence à l'activité SequenceActivity ; par conséquent, tous les gestionnaires de compensation sont appelés pour toutes les activités compensables imbriquées. Dans ce cas, les gestionnaires compensables des deux activités CompensatableSequenceActivity sont appelés.

Pour obtenir un exemple de code illustrant l'utilisation de l'activité CompensateActivity, consultez Using Compensation.

Voir aussi

Référence

CompensateActivity
CompensationHandlerActivity
ICompensatableActivity
CompensatableSequenceActivity
CompensatableTransactionScopeActivity

Concepts

Gestion des erreurs dans les workflows
Utilisation de la compensation dans les workflows
Utilisation de l'activité CompensatableSequenceActivity
Utilisation de l'activité CompensatableTransactionScopeActivity
Vue d'ensemble de la compensation
Ajout d'activités compensables et de gestionnaires de compensation

Autres ressources

Compensation Sample
Activités Windows Workflow Foundation

Footer image

Copyright ©2007 par Microsoft Corporation. Tous droits réservés.