共用方式為


使用 CompensateActivity 活動

CompensateActivity 活動會觸發已完成活動的補償,該活動會實作 ICompensatableActivity 介面。 只有實作 ICompensatableActivity 介面的活動可以補償。 兩個實作 ICompensatableActivity 介面的 Windows Workflow Foundation 全新活動分別是 CompensatableTransactionScopeActivityCompensatableSequenceActivity。 您也可以使用 ICompensatableActivity 介面來寫入支援補償的自訂活動。

如果外部可補償活動中沒有其他補償程式碼,則您不必使用 CompensateActivity 活動。 如果工作流程中有未處理的例外狀況,則會自動執行任何巢狀成功完成可補償活動的補償程式碼。 當您需要預設補償以外的某樣東西時,您應該只使用 CompensateActivity 活動。 預設補償以完成的相反順序叫用所有巢狀 ICompensatableActivity 子項的補償。 如果這不是您需要的順序,或您想要選擇性地叫用完成 ICompensatableActivity 子項的補償,您應該使用 CompensateActivity 活動。

注意

CompensateActivity 活動僅能在 CompensationHandlerActivity 活動、CancellationHandlerActivity 活動或 FaultHandlerActivity 活動中使用。

CompensateActivity 活動讓您決定您是否要補償支援補償的立即子項活動,以讓您透過補償處理序控制。 如果您在您的工作流程中使用巢狀可補償活動,您可以在補償區塊中或可補償活動的 faulthandler 區塊中新增 CompensateActivity 活動。 這樣可讓您的工作流程在巢狀可補償活動上明確執行補償。 如果可補償活動認可成功,指定您要在 CompensateActivity 中受補償的可補償活動,並且將執行在巢狀可補償活動中的任何補償程式碼。

如果您想要補償一個以上的巢狀可補償活動,為每個可補償活動新增 CompensateActivity 活動。 但是,如果 TargetActivityName 設定為與 CompensateActivity 活動有關的活動,則這樣將會觸發在所有支援補償的所有成功完成巢狀活動中的補償。 下列範例說明工作流程與 SequenceActivity 活動,這個活動有關聯 SequenceActivityCompensateActivity 活動。

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