Welcome

首页 / 软件开发 / .NET编程技术 / WF从入门到精通(第十一章):并行活动

WF从入门到精通(第十一章):并行活动2010-06-03 cnblogs GuoYong.Che学习完本章,你将掌握:

1.理解在工作流环境中Parallel活动是怎样执行的,并且懂得如何使用它们

2.并行执行路径中的同步数据存取和临界代码区

3.使用ConditionedActivityGroup活动去执行根据条件表达式判断执行路径的并行活动

在本书中截止目前为止,我们仅仅处理过顺序业务流程。如活动A执行后转到活动B的执行等等。我们还没看到过并行执行路径和由此通常伴随而来的错综复杂的情况。在本章中,我们将看看并行活动的处理过程,以及看看怎样对横跨并行执行路径的共享信息进行同步存取。

使用Parallel活动

当你用完某样东西需去杂货店买的时候,通常都可能只有一条结帐流水线。所有的顾客都必须通过这条唯一的结帐线来付款。在那些罕见的情况下,当有两个或更多的结帐线开放后,顾客和杂货结帐的速度会更快,因为他们是以并行的方式结帐的。

在某种意义上,工作流活动也是如此。有时,你不能以混乱的方式甚至更糟糕的随机的顺序来执行特定的活动。在这些情况下,你必须选择一个Sequence活动来容纳你的工作流。但在其它时候,你可能需要设计在同一时间(或者如我们将看到的,几乎是在同一时间)能够执行多个处理过程的流程。对于这些情况,Parallel活动是一个选择。

Parallel活动是一个组合活动,但它只支持Sequence活动作为它的子活动。(当然,你可自由地把你想使用的任何活动放到该Sequence活动中。)它至少需要两个Sequence活动。

子Sequence活动并没有在单独的线程上执行,因此Parallel活动不是一个多线程活动,相反,那些子Sequence活动在单一的一个线程上执行。WF会只对一个Parallel活动执行路径中的某一单独的活动进行处理,直到该活动完成才会切换到另一个并行执行路径中的一个单独的活动。也就是说,在某个分支内的某个单独的子活动完成后,才能安排其它分支中的另一个单独的子活动去执行(译者注:每个单独的子活动是Parallel活动执行的最小单位)。各个并行活动间真正的执行顺序是无法保证的。

这样的结果是并行执行路径不会同时被执行,因此它们并不是真正意义上的多线程中的并行执行。但是,它们执行时就像是在并行操作,并且你也可这样看待它们。把Parallel活动看成是真正意义的并行过程是最明智的:你可像对待任何多线程下的处理过程来对待并行活动。

注意:假如你需要强制指定并行执行路径间的顺序,可考虑使用SynchronizationScope活动。本章晚些时候我将对它进行演示。

在此时有个值得关注的问题:“有Delay活动会怎么样呢?”正如你知道的,顺序工作流中的Delay活动会停止执行指定的TimeoutDuration时间间隔。那这会停止Parallel活动的处理过程吗?答案是不会。延时会导致特定的顺序工作流路径将被停止,但其它并行路径会正常地继续进行处理。

考虑到我所发出过的所有这些多线程警告,你或许会认为使用Parallel活动是一个挑战。事实上,它非常容易使用。它在工作流视图设计器中呈现出来的样式和Listen活动(该活动在第10章“事件活动”中讨论过)非常相像。和EventDriven活动不同的是,你将会在它里面找到Sequence活动,除此之外,表现出来的可视化界面都是相似的。我们这就创建一个简单的例子来演示一下Parallel活动。

创建一个带有并行执行过程的新工作流应用程序

1.为了快速地演示Parallel活动,本例子使用的是一个基于控制台的Windows应用程序。我们需要下载本章源代码,源代码中包含有练习版和完整版两个版本的解决方案项目,完整版中的项目可直接运行查看运行结果,我们在此使用Visual Studio打开练习版中的解决方案项目文件。

2.在Visual Studio打开了ParallelHelloWorld解决方案后,找到Workflow1工作流并在工作流视图设计器中打开它。

3.从工具箱中拖拽一个Parallel活动到设计器界面上。