本节主要介绍Parallel,Pick,PickBranch,ParallelForEach<T> 的使用.
本文例子下载:
https://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()); |
结果 |