次の方法で共有


CompensateActivity アクティビティの使用

CompensateActivity アクティビティは、ICompensatableActivity インターフェイスを実装する、完了したアクティビティの補正をトリガします。補正できるのは、ICompensatableActivity インターフェイスを実装するアクティビティだけです。ICompensatableActivity インターフェイスが事前に実装されている Windows Workflow Foundation アクティビティは、CompensatableTransactionScopeActivity および CompensatableSequenceActivity の 2 つです。また、ICompensatableActivity インターフェイスを使用して、補正をサポートするカスタム アクティビティを作成することもできます。

外側の補正可能アクティビティに他の補正コードがないのであれば、CompensateActivity アクティビティを使用する必要はありません。入れ子になった、正常に完了している補正可能アクティビティの補正コードは、ワークフロー内で未処理の例外が発生した場合に、自動的に実行されます。CompensateActivity アクティビティを使用するのは、既定以外の補正が必要な場合だけです。既定の補正では、入れ子になったすべての ICompensatableActivity 子の補正が、完了した順とは逆に呼び出されます。この順序が適切ではない場合、または、完了した ICompensatableActivity 子の補正を任意に指定して呼び出す場合は、CompensateActivity アクティビティを使用する必要があります。

Noteメモ :

CompensateActivity アクティビティを使用できるのは、CompensationHandlerActivity アクティビティ、CancellationHandlerActivity アクティビティ、または FaultHandlerActivity アクティビティの中だけです。

CompensateActivity アクティビティを使用すると、補正をサポートする直接の子アクティビティの補正を実行するかどうかを決定できるので、補正プロセスを制御できます。ワークフローで入れ子の補正可能アクティビティを使用するには、補正可能アクティビティの補正ブロック、または、エラー ハンドラ ブロックに CompensateActivity アクティビティを追加します。これによって、ワークフローは、入れ子にされた補正可能アクティビティの補正を明示的に実行できるようになります。補正する補正可能アクティビティを CompensateActivity で指定すると、入れ子になった補正可能アクティビティ内のすべての補正コードが実行されます。ただし、補正可能アクティビティが正常にコミットされた場合に限ります。

入れ子になった複数の補正可能アクティビティを補正するには、各補正可能アクティビティに対して CompensateActivity アクティビティを追加します。ただし、TargetActivityNameCompensateActivity アクティビティに関係付けられているアクティビティに設定されている場合は、補正をサポートする入れ子になったアクティビティで正常に完了したものすべてについて補正が発生します。SequenceActivity を参照する CompensateActivity アクティビティを持つ 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>

ThrowActivity アクティビティが例外をスローした場合、SequenceActivity アクティビティに関連付けられた FaultHandlerActivity アクティビティが例外を処理し、CompensateActivity アクティビティを呼び出します。CompensateActivity アクティビティは SequenceActivity アクティビティを参照するため、すべての補正ハンドラが、入れ子になった補正可能なすべてのアクティビティに対して呼び出されます。この場合、両方の CompensatableSequenceActivity アクティビティに対する補正可能ハンドラが呼び出されます。

CompensateActivity アクティビティの使用方法を示すコード サンプルについては、「Using Compensation」を参照してください。

関連項目

参照

CompensateActivity
CompensationHandlerActivity
ICompensatableActivity
CompensatableSequenceActivity
CompensatableTransactionScopeActivity

概念

ワークフロー内のエラー処理
ワークフロー内での補正の使用
CompensatableSequenceActivity アクティビティの使用
CompensatableTransactionScopeActivity アクティビティの使用
補正の概要
補正可能なアクティビティと補正ハンドラの追加

その他の技術情報

Compensation Sample
Windows Workflow Foundation アクティビティ

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.