本篇内容包括:IfElse、Sequence、While和Parallel、Policy、ConditionActivityGroup、Replicator、SynchronizationScope。
示例:下载
IfElse
将IfElse活动拖到流程设计器上,默认就会有两个分支。这些分支都是IfElseBranch活动。对每一个IfElseBranchActivity应用一个条件,如果该条件的计算结果为true,则执行该活动中包含的活动;否则,计算下一个IfElseBranchActivity的条件,直到遇到一个符合条件的活动。
最后一个分支不用设置条件,它被当做Else分支处理。
(运行界面)
(运行结果)
选择相应的参数,就会根据条件判断执行相应的分支。
Sequence
Sequence是WF中最基本最简单的活动,它将多个活动链接在一起按顺序的方式执行。诸如WhileActivity活动之类的一些活动只能包含一个活动,SequenceActivity活动提供了一种简单方法,可将包含在单个SequenceActivity活动中的多个活动添加到只能包含一个活动的活动中。
While和Parallel
While
在每次迭代执行之前,都会计算与Condition属性相关联的规则条件或代码条件。如果该条件为true,则执行子活动,否则跳出循环。
While活动只能包含一个自活动,所有可以在WhileActivity内部使用SequenceActivity或者ParallelActivity,以便包含多个活动。
Parallel
Parallel子活动只能是Sequence,只有所有的子活动完成以后,Parallel才能完成。虽然 SequenceActivity 分支活动计划为同时开始处理,但它们却不会同时开始处理。Windows Workflow Foundation 运行时对每个工作流实例使用一个线程。 ParallelActivity 活动中所有单独的分支共享同一个工作流实例线程。 因此,一次只执行一个分支的一个活动。
所以,各个并行活动间真正的执行顺序是无法保证的,如果你需要强制指定并行执行路径间的顺序,可以考虑使SynchronizationScope。
处理操作首先执行其中一个 SequenceActivity 分支包含的一个活动。 该活动完成后,将会执行另一个分支的顺序中的下一个活动,依此类推。如下图(来自生鱼片):
如果 SequenceActivity 分支包含一个活动(如已阻止的 DelayActivity 活动),则执行不会停止下来并等待取消阻止该活动, 而是执行下一个 SequenceActivity 分支的顺序中的下一个活动。如图:
示例说明:
比如2,那么就会看到以下结果:
然后我们在code1和code3之间加入一个DelayActivity,那么执行结果如下:
Policy
类似于IfElse活动以“Declarative Rule Condition”方式进行逻辑判断。区别在于Policy活动时一组逻辑规则的集合,在规则集合内的每个规则都可以通过“Then Actions”来执行来执行当逻辑判断结果为“真”时所需要的操作,在“Else Actions”内来执行当逻辑判断为假时候所需要的操作。
关于本活动的例子,就是坚持学习WF(21):规则引擎中的RuleSet 中的例子。
ConditionActivityGroup
在CAG中的每个子活动都被增加了一个“WhenCondition属性”,不指定when条件的子活动只执行一次(相当于有多if else的while循环)。对于整个CAG活动:
n 如果CAG的UntilCondition的结果为true,那么CAG完成
n 如果没指定UntilCondition,那么在没有执行子活动,并且每一代子活动的when条件结果都是false时,CAG完成
ConditionedActivityGroup 活动首次开始执行时,将计算其 Until 条件。 如果 Until 条件的计算结果为 false,则计算 ConditionedActivityGroup 活动所含的所有第一代子活动的 When 条件。 如果某个活动的 When 条件的计算结果为 true,则计划(所有验证结束以后才执行When条件为true的,并不是验证一个执行一个)执行该活动。
每次所执行的子活动完成执行时,都会重新计算 ConditionedActivityGroup 活动的 Until 条件,以及所有不处于执行状态的第一代子活动的 When 条件。 只要 ConditionedActivityGroup 活动的 Until 条件计算结果为 true,就会立即取消当前正在执行的所有子活动。
Replicator(类似于for each)
该活动只能容纳一个子活动。它的用途是在运行时,复制它内部的子活动,每个活动都运行在自己的AEC中:
l 具体复制的数量有“InitialChildData”属性指定,该属性一般要等到工作流运行时才知道。
l 运行时,Replicator通过“ChildInitialized”和“ChildCompleted”事件与其内部的子活动进行数据交换。
l 必须设置ExecutionType属性。sequence或Parallel:前者表示以顺序方式运行子活动,一次一次的创建子活动的实例;后者表示并行执行,一次创建所有实例。
l 如果设置了UntilCondition属性,那么当它为true的时候(每次创建子活动之前,都会验证该条件),Replicator就会结束。
提示:在运行这个例子的时候,可以把ExecutionType改成Parallel,看看区别。
SynchronizationScope
具有相同“排他”标记的分支相对于具有其他不同“排他”标记来说是相对独立的运行集合。
只有一组相同排他标记的所有活动都运行完毕以后,下一组具有相同“排他”标记的集合才会执行。
示例:
两个分支设置了相同的SynchronizationHandles ,那么执行结果如下: