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

结果

 

 

 

posted @ 2009-12-17 18:14  WXWinter(冬)  阅读(8808)  评论(5编辑  收藏  举报