本節主要介紹CancellationScope在異常中的使用,以及CancellationScope在Parallel 的使用.
本文例子下載:
http://files.cnblogs.com/foundation/CancellationScopeSample.rar
本文例子說明
CancellationScope 取消容器
類名 System.Activities.Statements.CancellationScope 文件 System.Activities.dll 結構說明 繼承 NativeActivity
實例使用[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
結果