Utilizzo dell'attività CompensateActivity

L'attività CompensateActivity attiva la compensazione di un'attività completata che implementa l'interfaccia ICompensatableActivity. È possibile compensare solo attività che implementano l'interfaccia ICompensatableActivity. Le due attività Windows Workflow Foundation predefinite che implementano l'interfaccia ICompensatableActivity sono CompensatableTransactionScopeActivity e CompensatableSequenceActivity. È anche possibile scrivere attività personalizzate che supportano la compensazione utilizzando l'interfaccia ICompensatableActivity.

Non è necessario utilizzare un'attività CompensateActivity se non sono presenti altri codici di compensazione in un'attività compensabile esterna. Il codice di compensazione di un'attività compensabile nidifica completata viene eseguito automaticamente se si verifica un'eccezione non gestita nel flusso di lavoro. Si consiglia di utilizzare l'attività CompensateActivity solo quando è richiesta una compensazione diversa da quella predefinita. Una compensazione predefinita richiama la compensazione di tutti i figli ICompensatableActivity nidificati nell'ordine inverso rispetto al completamento. Se si desidera cambiare l'ordine o richiamare in modo selettivo la compensazione di figli ICompensatableActivity completati, utilizzare l'attività CompensateActivity.

Nota

L'attività CompensateActivity può essere utilizzata solo in attività CompensationHandlerActivity, CancellationHandlerActivity o FaultHandlerActivity.

L'attività CompensateActivity consente di controllare il processo di compensazione, consentendo di scegliere se si desidera compensare un'attività figlio di primo livello che supporta la compensazione. Se si utilizzano attività compensabili nidificate nel flusso di lavoro, è possibile aggiungere un'attività CompensateActivity nel blocco di compensazione o un blocco di gestione errori di un'attività compensabile. Ciò consente al flusso di lavoro di eseguire in modo esplicito la compensazione su un'attività compensabile nidificata. Specificare quale attività compensabile si desidera venga compensata in CompensateActivity, qualsiasi codice di compensazione nell'attività compensabile nidificata verrà eseguito, purché sia stato eseguito correttamente il commit dell'attività compensabile.

Se si desidera compensare più di un'attività compensabile nidificata, aggiungere un'attività CompensateActivity per ogni attività compensabile. Tuttavia, se la proprietà TargetActivityName viene impostata su un'attività associata all'attività CompensateActivity, verrà attivata la compensazione in tutte le attività nidificate completate che supportano tale compensazione. Nell'esempio seguente viene illustrato un flusso di lavoro con un'attività SequenceActivity contenente un'attività CompensateActivity che fa riferimento alla classe 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>

Quando viene generata un'eccezione dall'attività ThrowActivity, l'attività FaultHandlerActivity associata all'attività SequenceActivity gestisce l'eccezione e chiama l'attività CompensateActivity. Poiché l'attività CompensateActivity fa riferimento all'attività SequenceActivity, tutti i gestori di compensazione vengono chiamati in tutte le attività compensabili nidificate. In questo caso, vengono chiamati gestori compensabili per entrambe le attività CompensatableSequenceActivity.

Per un esempio di codice che illustri la modalità di utilizzo dell'attività CompensateActivity, vedere Using Compensation.

Vedere anche

Riferimenti

CompensateActivity
CompensationHandlerActivity
ICompensatableActivity
CompensatableSequenceActivity
CompensatableTransactionScopeActivity

Concetti

Gestione degli errori nei flussi di lavoro
Utilizzo della compensazione nei flussi di lavoro
Utilizzo dell'attività CompensatableSequenceActivity
Utilizzo dell'attività CompensatableTransactionScopeActivity
Panoramica sulla compensazione
Aggiunta di attività compensabili e di gestori di compensazione

Altre risorse

Compensation Sample
Attività di Windows Workflow Foundation

Footer image

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.