WF从入门到精通(第九章):逻辑流活动2010-06-03 cnblogs GuoYong.Che学习完本章,你将掌握:1.学会怎样使用IfElse活动来执行条件表达式2.学会怎样使用While活动来执行循环3.理解Replicator活动是怎样来模拟for循环的,以及它的使用方法。我们已经看到过怎样执行工作流内部和外部的代码,已经知道怎样处理异常,暂停进程,在事情脱离控制时终止我们的工作流。但无疑对于任何一个计算机系统的主要组成部分来说,都应具有根据运行时的条件做出判断以执行不同的任务的能力。在本章,我们将演示要求我们应付if/else场景及基本的循环的一些工作流活动。条件及条件处理现在,你可能不会感到奇怪,你发现WF提供了基于运行时的条件进行逻辑处理控制流的活动。毕竟,假如WF提供了活动去抛出并捕获异常,那它为什么就没有相应的活动来根据工作流的执行情况进行检测并根据它们获取的结果作出决策呢?我们将在本章中进行测试的活动包括IfElse活动、While活动和Replicator活动。IfElse活动的作用是测试一个条件并根据测试结果执行不同的工作流路径。While活动用来执行一个While循环。而对于for循环,则是使用Replicator活动来完成。现在通过本章的示例应用程序开始我们的学习。备注:在本章你将依靠CodeCondition来进行条件的处理,它(CodeCondition)的意思是你将写下C#代码来处理条件表达式。在12章(“策略和规则”)中,你将使用RuleCondition来对条件表达式的值进行处理,RuleCondition使用了WF的基于规则的处理方式。两种方式都同样有效。Qustioner应用程序本章的示例应用程序是一个Windows Form应用程序,它会请你回答三个问题,问题内容你能够进行修改。(问题的内容保存在应用程序的settings property中。)你也可指定这些问题是各自独立还是相互关联的。当工作流开始执行时你要把这些问题和相关的情况传入该工作流。相互关联的问题只有在前面的问题回答正确时才会被进一步提出。例如,假如有人问你:“谈到的文档你看过吗?”,假如你没有,则没多大意义问接下来这一问题:“这个文档你批准吗?”假如问题是相关的,则第一个问题回答是否定的话,就将返回否定的回答,余下的问题不予考虑也都将返回否定的回答。各自独立的问题要求你必须回答,而不管前面的问题中你回答的是什么。例如这个问题,“你喜欢冰淇淋吗?”就和问题“现在外面在下雨吗?”是不相关的。无论你喜不喜欢冰淇淋,你的答案都和外面的天气这个问题是各自独立的。对于相互独立的问题来说,不管你在前面的问题中是肯定还是否定的回答,都会进一步被问到。用户界面如图9-1。假如你修改三个问题中的任何一个的内容,新问题的都将自动地保存到你的应用程序的settings property中(问题的类型也一样)。这些问题会产生“是/否”的回答,使工作流能够把这些回答作为一个Boolean类型的数组传回到宿主应用程序中。

图9-1 Questioner主应用程序界面当你点击Execute按钮时,这些问题通过带“是”和“否”按钮的信息框依次呈现。一旦工作流处理完所有的这些问题,它就返回一个Boolean数组给宿主应用程序。宿主应用程序将检查该数组以显示不同的用户界面。当工作流执行时,回答结果将以蓝色圆球的形式显示(如图9-1)。当工作流任务完成后,通过的回答将以绿色圆球的形式出现,未通过的回答将以红色圆球的形式出现。假如所有的回答都通过了,则“最终回答结果”图片将以绿色圆球的形式呈现。但是,假如三个问题中的任何一个没有通过,则“最终回答结果”图片将以带“8”字的圆球的形式呈现。如图9-2。

图9-2 Questioner应用程序执行期间的用户界面对你来说,使用这个应用程序的目的是测试本章中的三个活动。第一次迭代,Questioner将使用IfElse活动来判断要执行什么动作过程。第二次迭代时这些问题仍然会被问到,我们将使用While活动来提问。最后一次迭代我们将使用Replicator活动来模拟for循环进行提问。对于该应用程序的每一次迭代,我们都将使用前一章中演示的技术来把回答的结果传回给宿主应用程序。