代码改变世界

《WF编程》系列之26 - 基本活动:ParallelActivity & DelayActivity & ListenActivity

2007-07-26 15:11  Windie Chai  阅读(...)  评论(...编辑  收藏

4.1.9 ParallelActivity

Parallel活动允许多个活动同时执行,但Parallel活动并没有采用多线程机制,在工作流内部只有一个线程执行.

看起来好像有点复杂,这样说吧,假设一份文件需要公司里三位领导的批准:CEO,CTO和CFO.宿主会把这份文件递交给三位老大,这就是Parallel活动的”并行”.领导审批之后会触发审批相应的事件(领导们很难在同一时刻审批,所以Parallel活动并不是真正的并行),我们知道HandleExternalEvent活动可以等待并处理本地通信服务的事件,所以我们还需要三个HandleExternalEvent活动.

接下来编写一个顺序工作流来实现上面的需求,我们假设CEO的审批最先到达,然后是CTO,最后是CFO.只是这样的话在CEO还没有作出决定之前CTO和CFO只好干等.

如果审批的顺序并不重要的话,通过软件来收集审批结果就会更有效率.下图中的Parallel活动同时监听了三个事件.哪位老大的审批最先送达,工作流就处理哪个事件,同时还等待另外两个事件.只有当所有的分支都完成后Parallel活动才会结束.




4.1.10 DelayActivity

Delay活动会初始化一个计时器并等待它到期. Delay活动经常被用来模拟超时, 当计时器到期后工作流引擎还会继续执行.它的TimeoutDuration属性的值是TimeSpan类型,表示需要等待的时间.我们可以在设计器中初始化这个属性,也可以以编程的方式在InitializeTimeoutDuration事件中更改它的值:

private void delayActivity1_InitializeTimeoutDuration(object sender, EventArgs e)



DelayActivity delay 
= sender as DelayActivity; 

if (delay != null



// a 5 second time span 

delay.TimeoutDuration 
= new TimeSpan(005); 

}

}

Delay活动经常被用在Listen活动的内部.

4.1.11 ListenActivity

和Parallel活动相比,Listen活动也可以包含多个分支.但不同的是Listen活动的目的仅仅是完成一个分支.Listen活动的分支是EventDriven活动,EventDriven活动的特点是它必须以事件的到达为其开始的条件(即EventDriven活动的第一个子活动必须实现IEventActivity接口).我们将和状态机工作流一起介绍EventDriven活动的更多细节.

再继续前面关于CEO,CTO和CFO的例子,上一节中,工作流在收集齐三位领导的三分审批之后才会继续.如果我们只需要一份审批,就应该用Listen活动来替换Parallel活动.当一份审批到达时,Listen活动就会执行相应的分支事件并取消其它分支的执行.

之前曾提到,我们可以使用Delay活动来模拟超时.下图正是采用了这种搭配.如果在到期之前仍然没有事件到达,我们就可以执行一个可选的操作,比如给领导发送Email来提醒他审批,或者直接做一个默认的审批处理,就当领导默认了!