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

WF 4.0基礎篇(十二) CancellationScope 取消容器

編輯:關於.NET

本節主要介紹CancellationScope在異常中的使用,以及CancellationScope在Parallel 的使用.

本文例子下載:

http://files.cnblogs.com/foundation/CancellationScopeSample.rar

本文例子說明

CancellationScope 取消容器

類名 System.Activities.Statements.CancellationScope 文件 System.Activities.dll 結構說明 繼承 NativeActivity
是一個 sealed類
override 了 [CacheMetadata方法] 與 [Execute方法] 與[Cancel 方法]
[Body]屬性的類型為[Activity]
[CancellationHandler] 屬性 的類型為[Activity]
[Variables] 屬性 的類型為 [Collection<Variable>] 功能說明 [CancellationScope]中可以定義變量
[CancellationScope]由[Body]與 [CancelHandler] 兩部分組成,[Body]為正常執行 路徑, 如果取消執行會調用 [CancelHandler]中的內容

實例使用[OnUnhandledException.Cancel]處理異常

實例使用[OnUnhandledException.Cancel]處理異常時,[CancelHandler] 部分會被調用

ExceptionActivity

public sealed class ExceptionActivity : CodeActivity
{
protected override void Execute (CodeActivityContext context)
{
int v = 1 -1;
double i = 1 / v;
}
}

流程

宿主

//==============================================================
static void workflowCompleted (WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,實例編號:{0},狀態:{1}", e.InstanceId, e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,實例編號:{1},Reason:{0}", e.Reason.Message, e.InstanceId);
}
//==============================================================
#region //CancellationWorkflow 例子
static void exceptionActivityWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new CancellationWorkflow ());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs> (workflowCompleted);
instance.OnUnhandledException = unhandledException_Cancel;
instance.Aborted = aborted;
instance.Run();
}
static UnhandledExceptionAction unhandledException_Cancel (WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException_Cancel:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
#endregion

結果

1.如果異常出現在[CancellationScope 取消 容器]中,當[UnhandledExceptionAction]方法的返回值為[Cancel]時,會調用[CancellationScope]的[CancelHandler]部分

2.完成 [CancelHandler]部分後,流程結束.會調用實例的[OnCompleted ]

Parallel中使用 CancellationScope

在WF4中,可以使用[Parallel] 並行執行多條分支,當[Parallel]中的所有分支都執行完成後,[Parallel]結束.

可以使用[Pick]實現多條等待分支的單線執行,當一條分支被觸發後,其它分支就不會被觸發了,當觸發的分支完成後,[Pick]結束

但有時我們會的這樣一種需求,我們需要並行執行多條分支,當並行分支中的一條或幾條分支滿足指定條件時,其它正在執行的分支就不 執了.同時,為了保證數據的完整性,我們需要在那些可能要取消的分支中余留一組代碼.這組代碼用於在該分支被取消後做一些收尾工做

可以在[Parallel]容器中使用[CancellationScope],當[Parallel]的[CompletionCondition]屬性為[True]時,[Parallel]容器會在其內 部[CancellationScope]容器執行完成後,結束其它正在執行的並行分支.如果其它正在執行的並行分支是[CancellationScope],則會調用該 [CancellationScope]的[CancelHandler]

例子:

1.在流程中添加bool 型變量[myVariable],默認值False

2.添加[Parallel],並添加二個CancellationScope分支

第一個分支:

[Body]部分:添加[Delay]延時 15秒;添加[WriteLine]打印當"A" 添加[Assign]為變量[myVariable]賦值True

[CancelHandler]部分:添加[WriteLine]打印當"Cancellation:A取消"

第二個分支:

添加[Delay]延時 10秒;添加[WriteLine]打印當"B" ; 添加[Assign]為變量[myVariable]賦值True

[CancelHandler]部分:添加[WriteLine]打印當"Cancellation:B取消"

3. 將[Parallel.CompletionCondition ] 綁定到變量[myVariable]

流程

宿主

//==============================================================
static void workflowCompleted (WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,實例編號:{0},狀態:{1}", e.InstanceId, e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted ,實例編號:{1},Reason:{0}", e.Reason.Message, e.InstanceId);
}
static UnhandledExceptionAction unhandledException_Cancel(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException_Cancel:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel;
}
//==============================================================
#region //ParallelCancellationWorkflow 例子
static void parallelCancellationWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new ParallelCancellationWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledException_Cancel;
instance.Aborted = aborted;
instance.Run();
}
#endregion

結果

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