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

本节主要介绍Parallel,Pick,PickBranch,ParallelForEach<T> 的使用.

 

本文例子下载:

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

本文例子说明

WF4.0 基础篇 (九) 控制流Activity_第1张图片

控制流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 属性]为真时,并行容器完成,其他没的执行完成的分支就不再执行了(包括执行一半的分支)

WF4.0 基础篇 (九) 控制流Activity_第2张图片

 

例:基本使用

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

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

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

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

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

 

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

 

流程

WF4.0 基础篇 (九) 控制流Activity_第3张图片

宿主

 

WorkflowInvoker.Invoke(new ParallelWorkflow());

结果

WF4.0 基础篇 (九) 控制流Activity_第4张图片

 

例: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]

 

流程

WF4.0 基础篇 (九) 控制流Activity_第5张图片

宿主

 

WorkflowInvoker.Invoke(new ParallelCompletionConditionWorkflow());

结果

WF4.0 基础篇 (九) 控制流Activity_第6张图片

 

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]也不会被触发

 

WF4.0 基础篇 (九) 控制流Activity_第7张图片

 

例:基本使用

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"

 

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

 

流程

WF4.0 基础篇 (九) 控制流Activity_第8张图片

宿主

 

WorkflowInvoker.Invoke(new PickWorkflow());

结果

WF4.0 基础篇 (九) 控制流Activity_第9张图片

 

 

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]中被访问

WF4.0 基础篇 (九) 控制流Activity_第10张图片

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

 

WF4.0 基础篇 (九) 控制流Activity_第11张图片

例:基本使用

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 );

}

}

流程

WF4.0 基础篇 (九) 控制流Activity_第12张图片

宿主

 

WorkflowInvoker.Invoke(new ParallelForEachWorkflow());

结果

WF4.0 基础篇 (九) 控制流Activity_第13张图片

 

 

 

 

你可能感兴趣的:(Activity)