代码改变世界

《WF编程》系列之27 - 基本活动:EventHandlingScopeActivity & SynchronizationScopeActivity & ReplicatorActivity

2007-07-27 02:41  Windie Chai  阅读(3531)  评论(3编辑  收藏  举报

4.1.12 EventHandlingScopeActivity

和Listen活动类似,EventHandlingScope活动也可以包含多个等待事件的分支.我们可以在EventHandlingScope活动的右键菜单中选择查看事件处理程序(View Events)来查看这些分支.这两个活动主要的区别是EventHandlingScope在其主要子活动未执行完之前会一直监听其余的事件(主要子活动即默认视图显示的内容, EventHandlingScope活动包含一个主要子活动,错误处理程序和取消处理程序).

假如工作流需要在30分钟内统计员工的投票.我们应该设置EventHandlingScope的主要子活动为Delay活动,并让它延时30分钟.然后我们把处理事件的活动添加到事件分支中来监听投票的结果.这个活动会一直处理投票直到Delay活动完成(即所谓的”过期不候”).


4.1.13 SynchronizationScopeActivity

我们知道,Parallel活动会同时执行它的每个分支, SynchronizationScope活动则正好相反,它的作用是阻止将要同时执行的活动,并让它们一个接一个的执行.

要做到这一点,我们需要向SynchronizationScope活动的SynchronizationHandles属性中添加同步句柄(或者理解为互斥标记), SynchronizationHandles属性是一个字符串集合.如果多个可能同时执行的SynchronizationScope活动的SynchronizationHandles属性中包含相同的同步句柄,那么这几个SynchronizationScope活动就不会同时执行.每当一个SynchronizationScope活动完成,相同的同步句柄就会被释放,接着刚才一直出于等待状态的其它实例中会有一个获得此同步句柄然后开始执行.

如果没有没有设置SynchronizationHandles属性, SynchronizationScope活动的功能就不会发挥,这时的SynchronizationScope活动就相当于一个Sequence活动了.

4.1.14 ReplicatorActivity

Replicator活动和While活动类似,而且更加复杂.通过设置其ExecutionType属性,Replicator可以处理顺序或者并行的数据集合.回想一下我介绍Parallel活动时的范例,三位领导审批之后我们的工作流才能继续执行.但是如果我们并不知道需要处理多少个事件呢?需要处理的数目只有Runtime在运行时才能获取.这种情况下,最适合使用Replicator活动.比如投票这种场景,Replicator活动就可以创建所需数目的事件监听器.

Replicator会去处理其InitialChildData属性中的数据对象列表中的数据,每处理一项,就会创建一个子活动的副本,直到其所有子活动都完成;此外,Replicator活动还有一个UntilCondition属性,Replicator会在开始前和每完成一个子活动时都去判断这个属性的值.如果返回true,Replicator就会停止(而且会丢弃尚未操作的子活动).和WF中其它的条件一样,UntilCondition也可以设置为规则条件或者代码条件.

也可以这样理解,Repicator活动只能包含一个子活动,在其运行时,会取出InitialChildData属性中的所有数据,然后为每一个数据创建一个子活动的副本.

Replicator还会触发了一些有用的事件,包括Initialized,Completed,ChildInitialized和ChildCompleted.我们可以ChildInitialized事件中为子活动副本指定需要的数据.