WF4.0 基础篇 (十二) CancellationScope 取消容器
本节主要介绍CancellationScope在异常中的使用,以及CancellationScope在Parallel 的使用.
本文例子下载:
https://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 |
结果 |