WF4.0 基础篇 (十二) CancellationScope 取消容器

本节主要介绍CancellationScope在异常中的使用,以及CancellationScope在Parallel 的使用.

 

本文例子下载:

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

本文例子说明

image.png

 


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]中的内容

image.png

 

image.png

 

实例使用[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;

}

}

流程

image.png

宿主

//==============================================================

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

结果

image.png

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]

 

流程

image.png

宿主

 

//==============================================================

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

结果

image.png

 

 

 


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864