本文例子說明
CompensableActivity 補償容器
補償使用戶可以指定對基於身體活動的成功完成後發生的活動的活動而須采取糾正行動
CompensableActivity 補償容器
類名 System.Activities.Statements.CompensableActivity 文件 System.Activities.dll 結構說明 繼承 NativeActivity<CompensationToken>
是一個 sealed類
override 了 [CacheMetadata方法] 與 [Execute方法] 與[Cancel]
override 了 [CanInduceIdle 屬性]
[Variables] 屬性 的類型為[Collection<Variable>]
[Body] 屬性 的類型為[Activity]
[CancellationHandler] 屬性 的類型為[Activity]
[CompensationHandler] 屬性 的類型為[Activity]
[ConfirmationHandler] 屬性 的類型為[Activity]
返回值為 System.Activities.Statements.CompensationToken
功能說明 [CompensableActivity]中可以定義變量[CompensableActivity] 是補償容器,在[CompensableActivity] 中的如下四個容器
[Body]容器,主體
[CancellationHandler]容器,產生[Cancel]行為時調用
[CompensationHandler]容器,當顯式調用[Compensate]或流程異常完成時調用
[ConfirmationHandler]容器,當顯式調用[Confirm]或流程正常完成時調用
Compensate 補償
類名 System.Activities.Statements.Compensate 文件 System.Activities.dll 結構說明 繼承 NativeActivity是一個 sealed類
override 了 [CacheMetadata方法] 與 [Execute方法] 與[Cancel]
[Target] 屬性 的類型為[System.Activities.Statements.CompensationToken]
功能說明 [Compensate 補償] 用來顯式調用[ CompensableActivity] 的 [CompensationHandler]Confirm 確認
類名 System.Activities.Statements.Confirm 文件 System.Activities.dll 結構說明 繼承 NativeActivity
是一個 sealed類
override 了 [CacheMetadata方法] 與 [Execute方法]與[Cancel]
[Target] 屬性 的類型為[System.Activities.Statements.CompensationToken]
功能說明 [Confirm 確認]用來顯式調用[ CompensableActivity] 的 [ConfirmationHandler]
CompensableActivity容器 自動執行 ConfirmationHandler 的自動執行
當流程完成時會自動調用所有[CompensableActivity]中的ConfirmationHandler
流程
宿主
//==============================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}", e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
//==============================================================
static void confirmWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new ConfirmWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledExceptionl;
instance.Aborted = aborted;
instance.Run();
}
結果
CompensationHandler 的自動執行
只有為 [實例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]時
當流程在[CompensableActivity]的外部產生異常,才會自動調用[CompensableActivity]中的CompensationHandler
流程
宿主
//==============================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}", e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
//==============================================================
static void compensateWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new CompensateWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledExceptionl;
instance.Aborted = aborted;
instance.Run();
}
結果
不為 [實例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]時
CancellationHandler 的使用
只有為 [實例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]時
當流程在[CompensableActivity]的[Body]部分產生異常,才會自動調用[CompensableActivity]中的CompensationHandler
CancellationHandler與 CompensationHandler的區別
1.當異常發生在[CompensableActivity]外部時,會調用 [CompensationHandler]
2.當異常發生在[CompensableActivity.Body]部分時,會調用 [CancellationHandler]
3.[CompensationHandler]可以被[Compensate] 顯示調用
流程
宿主
//==============================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}", e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
//==============================================================
#region //Cancel 例子
static void cancelWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new CancelWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledExceptionl;
instance.Aborted = aborted;
instance.Run();
}
#endregion
結果
不為 [實例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]時
CompensableActivity 顯示調用
使用[Confirm]可以顯示調用[CompensableActivity]的[ConfirmationHandler]部分
使用[Compensate]可以顯示調用[CompensableActivity]的[CompensationHandler]部分
要顯示調用[CompensableActivity],需要定義一個[ System.Activities.Statements.CompensationToken]型變量,將 [CompensableActivity]的[Result]綁定到該變量上.再將[Confirm]或[Compensate]的[Target]屬性綁定到該變量上即可實現顯示調用
一個[CompensableActivity]只能被調用一次.調用兩次以上會出錯
如果[Confirm]調用後,[Compensate]再調用會出錯
如果[Compensate]調用後,[Confirm]再調用會出錯
[Confirm]或[Compensate]調用後,不會再被自動調用
Confirm 的使用
當在流程中用[Confirm]調用其所對應的[CompensableActivity]的[ConfirmationHandler]時,[ConfirmationHandler]中的內容會被立 即執行,這與自動調用不同
流程
宿主
//==============================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}", e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
//==============================================================
static void confirmCallWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new ConfirmCallWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledExceptionl;
instance.Aborted = aborted;
instance.Run();
}
結果
Compensate 的使用
當在流程中用[Compensate]調用其所對應的[CompensableActivity]的[CompensationHandle]時,[CompensationHandle]中的內容會被立 即執行,這與自動調用不同
顯示調用[Compensate]時,不需要為 [實例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]
流程
宿主
//==============================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}", e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
//==============================================================
static void compensateCallWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new CompensateCallWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledExceptionl;
instance.Aborted = aborted;
instance.Run();
}
結果
多個/嵌套 CompensableActivity 容器 無異常時
如果有多個[CompensableActivity]或[CompensableActivity]有嵌套時,[ConfirmationHandler]執行順序是:
在同級別容器中,是從下向上[ConfirmationHandler],在嵌套容器中是從外向內[ConfirmationHandler]
有異常,但異常不在CompensableActivity中時
如果有多個[CompensableActivity]或[CompensableActivity]有嵌套時,[ConfirmationHandler]與[CompensationHandler]執行順序 是:
1.如果產生異常的[Activity]與[CompensableActivity]在同級別容器中,則該級別的[CompensableActivity]會執行 [ConfirmationHandler].
[CompensableActivity]嵌套的[CompensableActivity]會執行[ConfirmationHandler]
異常在CompensableActivity中時
如果有多個[CompensableActivity]或[CompensableActivity]有嵌套時,[ConfirmationHandler][CompensationHandler]與 [CancellationHandler]執行順序是:
1.如果產生異常的[Activity]與[CompensableActivity]在同級別容器中,則該級別的[CompensableActivity]會執行 [ConfirmationHandler].
[CompensableActivity]嵌套的[CompensableActivity]會執行[ConfirmationHandler]
2.如果產生異常的[Activity]與[CompensableActivity]具有[父子孫]的直接層級關系,會調用這些具有[父子孫]直接層級關系 [CompensableActivity]的[CancellationHandler]
TerminateWorkflow 不會觸發CompensableActivity的任何行為
流程
宿主
//==============================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}", e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
//==============================================================
#region //Terminate 例子
static void terminateWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new TerminateWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledExceptionl;
instance.Aborted = aborted;
instance.Run();
}
#endregion
結果
源碼:http://files.cnblogs.com/foundation/CompensableWorkflow.rar