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

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(0, 0, 5);
}
}

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

4.1.11 ListenActivity

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

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

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

8 Comments

  1. tsing 说道:

    "当计时器到期后工作流引擎还会继续执行" 这句话是否有问题?应该是在等待计时器到期的时候允许其它工作流继续执行?

  2. 笑煞天 说道:

    @tsing
    我觉得没有误解吧,结合整句来看,Delay活动使得工作流不再往下执行,而Delay的时间过去之后,工作流则继续执行。
    单单一个Delay在执行时是不允许工作流内其它活动执行的,但Delay可以配合其它活动,如EventHandlingScope来实现Delay和其它活动的“同时”执行。

  3. 色即是空 说道:

    请问下楼主,ParallelActivity可以运行时动态插入分支吗?如果可以怎么实现。
    我用ParallelActivity.Activities.Add();插入总是不成功。
    用ParallelActivity.Activities.Insert();也是不可以。

    谢谢楼主

  4. Windie Chai 说道:

    @色即是空可以试试用WorkflowChanges来更改ParallelActivity的子活动。

  5. 色即是空 说道:

    楼主,太感谢你了。谢谢你。已经解决了。

  6. 色即是空 说道:

    楼主,请问从子工作流中回退到主工作流的状态一般都怎么解决?谢谢你。

  7. f322 说道:

    单单一个Delay在执行时是不允许工作流内其它活动执行的,那在Listen活动中的另外两个子活动就不可能执行了?

  8. Windie Chai 说道:

    @f322“单单一个Delay”是指没有和Delay并列的其他活动,在Listen中,Delay所在的分支会暂停,但其他分支仍然能够继续执行。

Leave a Reply