现在的位置: 首页 > 综合 > 正文

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

2014年04月05日 ⁄ 综合 ⁄ 共 3583字 ⁄ 字号 评论关闭
文章目录

本节主要介绍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());

结果

 

 

抱歉!评论已关闭.