程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WF 4.0基礎篇(十六) CompensableActivity補償

WF 4.0基礎篇(十六) CompensableActivity補償

編輯:關於.NET

本文例子說明

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved