Verwenden der CompensateActivity-Aktivität
Die CompensateActivity-Aktivität löst die Kompensierung einer abgeschlossenen Aktivität aus, die die ICompensatableActivity-Schnittstelle implementiert. Nur Aktivitäten, die die ICompensatableActivity-Schnittstelle implementieren, können kompensiert werden. Die zwei vordefinierten Windows Workflow Foundation-Aktivitäten, die die ICompensatableActivity-Schnittstelle implementieren, sind CompensatableTransactionScopeActivity und CompensatableSequenceActivity. Sie können auch benutzerdefinierte Aktivitäten schreiben, die mithilfe der ICompensatableActivity-Schnittstelle Kompensierung unterstützten
Die Verwendung einer CompensateActivity-Aktivität ist nicht erforderlich. falls sich in einer äußeren kompensierbaren Aktivität kein anderer Kompensierungscode befindet. Der Kompensierungscode aller geschachtelten und erfolgreich abgeschlossenen kompensierbaren Aktivitäten wird automatisch ausgeführt, wenn sich im Workflow eine nicht behandelte Ausnahme befindet. Verwenden Sie die CompensateActivity-Aktivität nur, wenn Sie eine andere als die standardmäßige Kompensierung benötigen. Mit der Standardkompensierung wird die Kompensierung aller geschachtelten untergeordneten ICompensatableActivity-Elemente in der umgekehrten Reihenfolge ihres Abschlusses aufgerufen. Entspricht diese Reihenfolge nicht Ihren Anforderungen, oder möchten Sie die Kompensierung abgeschlossener untergeordneter ICompensatableActivity-Elemente selektiv auslösen, verwenden Sie die CompensateActivity-Aktivität.
Hinweis
Die CompensateActivity-Aktivität kann nur in einer CompensationHandlerActivity-Aktivität, einerCancellationHandlerActivity-Aktivität oder einer FaultHandlerActivity-Aktivität verwendet werden.
Die CompensateActivity-Aktivität ermöglicht die Steuerung des Kompensierungsprozesses, da Sie bestimmen können, ob eine unmittelbare untergeordnete Aktivität, die Kompensierung unterstützt, kompensiert werden soll. Werden im Workflow geschachtelte kompensierbare Aktivitäten unterstützt, kann eine CompensateActivity-Aktivität im Kompensierungsblock oder einem faulthandler-Block einer kompensierbaren Aktivität hinzugefügt werden. Dadurch wird dem Workflow die explizite Ausführung von Kompensierung in einer geschachtelten kompensierbaren Aktivität ermöglicht. Geben Sie an, welche kompensierbare Aktivität in CompensateActivity kompensiert werden soll. Daraufhin wird sämtlicher Kompensierungscode in der geschachtelten kompensierbaren Aktivität ausgeführt, sofern für die kompensierbare Aktivität erfolgreich ein Commit durchgeführt wurde.
Soll mehr als eine geschachtelte kompensierbare Aktivität kompensiert werden, fügen Sie für jede kompensierbare Aktivität eine CompensateActivity-Aktivität hinzu. Sofern TargetActivityName auf eine Aktivität festgelegt wird, die der CompensateActivity-Aktivität zugeordnet ist, wird dadurch Kompensierung in allen abgeschlossenen geschachtelten Aktivitäten, die Kompensierung unterstützen, ausgelöst. Das folgende Beispiel zeigt einen Workflow mit einer SequenceActivity-Aktivität, die über eine CompensateActivity-Aktivität verfügt, die sich auf SequenceActivity bezieht.
<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>
Wird eine Ausnahme von der ThrowActivity-Aktivität ausgelöst, behandelt die der SequenceActivity-Aktivität zugeordnete FaultHandlerActivity-Aktivität die Ausnahme und ruft die CompensateActivity-Aktivität auf. Da sich die CompensateActivity-Aktivität auf die SequenceActivity-Aktivität bezieht, werden alle Kompensierungshandler in allen geschachtelten kompensierbaren Aktivitäten aufgerufen. In diesem Fall werden kompensierbare Handler für beide CompensatableSequenceActivity-Aktivitäten aufgerufen.
Ein Codebeispiel, in dem die Verwendung der CompensateActivity-Aktivität veranschaulicht wird, finden Sie unter Using Compensation.
Siehe auch
Referenz
CompensateActivity
CompensationHandlerActivity
ICompensatableActivity
CompensatableSequenceActivity
CompensatableTransactionScopeActivity
Konzepte
Fehlerbehandlung in Workflows
Verwenden von Kompensierung in Workflows
Verwenden der CompensatableSequenceActivity-Aktivität
Verwenden der CompensatableTransactionScopeActivity-Aktivität
Übersicht über die Kompensierung
Hinzufügen von kompensierbaren Aktivitäten und Kompensierungshandlern
Weitere Ressourcen
Compensation Sample
Windows Workflow Foundation-Aktivitäten
Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.