您的位置:首页 > 其它

WF4.0 基础篇 (九) 控制流Activity

2013-10-11 22:59 351 查看
本节主要介绍Parallel,Pick,PickBranch,ParallelForEach<T>
的使用.



本文例子下载:
http://files.cnblogs.com/foundation/controlActivitySample2.rar

本文例子说明



控制流Activity

Parallel 并行容器

类名
System.Activities.Statements.Parallel

文件
System.Activities.dll

结构说明
继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel 方法]

[CompletionCondition]属性的类型为[ Activity<bool> ],可以接受一个结果为[bool]的表达式

[Branches] 属性 的类型为[Collection<Activity>],是并行分支集合

[Variables] 属性 的类型为[Collection<Variable>]

功能说明
[Parallel]中可以定义变量

[Parallel]会并行执行[Branches] 集合内的所有Activity

当[ CompletionCondition 属性]为真时,并行容器完成,其他没的执行完成的分支就不再执行了(包括执行一半的分支)





例:基本使用

1.在流程中添加[WriteLine]打印当前时间

2.添加[Parallel],并添加两个分支

第一个分支添加[Delay]延时 10秒, 添加[WriteLine]打印当"A"

第二个分支添加[Delay]延时 15秒, 添加[WriteLine]打印当"B"

3.在流程中添加[WriteLine]打印当前时间



预期:两次的系统时间差为15秒表示为并行, 两次的系统时间差为25秒表示为串行



流程


宿主
WorkflowInvoker.Invoke(new
ParallelWorkflow());

结果


例:CompletionCondition 说明

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

2.添加[Parallel],并添加三个分支

第一个分支: 添加[WriteLine]打印当"A1" ;添加[Delay]延时 10秒;添加[WriteLine]打印当"A2"

第二个分支: 添加[WriteLine]打印当"B1" ;添加[Delay]延时 15秒;添加[WriteLine]打印当"B2" ; 添加[Assign]为变量[myVariable]赋值True

第三个分支: 添加[WriteLine]打印当"C1" ;添加[Delay]延时 20秒;添加[WriteLine]打印当"C2"



预期: [Assign]为变量[myVariable]赋值True后,容器结束,因此会依次看到[A1,B1,C1,A2,B2],但看不到[C2]



流程


宿主
WorkflowInvoker.Invoke(new
ParallelCompletionConditionWorkflow());

结果


Pick,PickBranch 触发容器

Pick

类名
System.Activities.Statements.Pick

文件
System.Activities.dll

结构说明
继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel 方法]

override 了 [CanInduceIdle]属性

[Branches ] 属性 的类型为[ Collection<PickBranch> ]

PickBranch

类名
System.Activities.Statements. PickBranch

文件
System.Activities.dll

结构说明
继承 Object

是一个 sealed类

[Action]属性 的类型为[Activity]

[DisplayName] 属性 的类型为[string]

[Trigger] 属性 的类型为[Activity]

[Variables] 属性 的类型为[Collection<Variable>]

功能说明

1. [Pick]触发容器,提供了基于事件的控制流。 [Branches]集合是触发容器的分支集合,只能添加[PickBranch]

2. [Pick]触发容器中可以定义变量

3. [PickBranch] 只可添加到[Pick]中,[PickBranch.Trigger]只能放入触发类Activity,[PickBranch.Action] 当[PickBranch.Trigger] 被触发时,所要执行的Activity

4.只要有一个[PickBranch]的[Trigger]被触发,其他[PickBranch]就不会被触发了

5.即使在被执行的[PickBranch]还没完成时,其他[PickBranch]也不会被触发





例:基本使用

1.在工作流中添加[WriteLine],打印系统时间

2.在工作流中添加[Pick],添加三个[PickBranch]

第一个分支: [Trigger]添加[Delay]延时 15秒

[Action]添加[WriteLine]打印当"A"

第二个分支: [Trigger]添加[Delay]延时 10秒

[Action]添加[WriteLine]打印当"B1"

添加[Delay]延时 15秒

添加[WriteLine]打印当"B2"

第三个分支: [Trigger]添加[Delay]延时 20秒

[Action]添加[WriteLine]打印当"C"



预期:只有第二个分支会被执行



流程


宿主
WorkflowInvoker.Invoke(new
PickWorkflow());

结果


ParallelForEach<T> 循环

类名
System.Activities.Statements.ParallelForEach<T>

文件
System.Activities.dll

结构说明
继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法]

[CompletionCondition]属性的类型为[ Activity<bool> ],可以接受一个结果为[bool]的表达式

[Body] 属性 的类型为[ActivityAction<T>]

[Values] 属性 的类型为[ InArgument<IEnumerable<T>> ]

功能说明
[Values] 属性为要循环的集合

[TypeArgument] 为要循环集合的的类型

[item]为循环时的临时变量,可在[Body]中被访问



每个迭代完成后,检查[ CompletionCondition 属性],为真时,完成



例:基本使用

1. 创建一code activity 名为[CollectionActivity],

具有[Out]参数,类型为List<string>的参数[myOutCollection]

2. 在流程中添加List<string>变量[myCollection]

3. 在流程中添加[CollectionActivity],将[CollectionActivity.myOutCollection]参数绑定到 [myCollection] 变量

4. 在流程中添加[ForEach<T>],[TypeArgument]属性指定[string]

[Values] 属性绑定到 [myCollection] 变量

在[Body]中添加[writeLine],打印[item]



CollectionActivity
public
sealed class
CollectionActivity : CodeActivity

{

public
OutArgument<System.Collections.Generic.List<string>> myOutCollection {
get; set; }

protected
override void Execute(CodeActivityContext context)

{

System.Collections.Generic.List<string> list =
new List<string>();

list.Add("wxd");

list.Add("lzm");

list.Add("wxwinter");



context.SetValue (this.myOutCollection,list );

}

}

流程


宿主
WorkflowInvoker.Invoke(new
ParallelForEachWorkflow());

结果


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: