WF 工作流(3)

在这一章,你将会使用流程图活动创建一个工作流。正如它的名字,一个流程图活动就如它是一个流程图,活动是用决策树来连接的。使用一个Sequence活动,它的子活动只可以从上到下的执行。而在一个流程图活动中,它的子活动可以用任意的顺序执行。

 

创建一个流程图工作流

创建一个项目,选择Workflow Console Application模板,如图Figure3-1所示。

 

 

设计流程图

拖拉一个Flowchart活动到设计器重。初始的图形类似于Figure3-2。绿色的圆圈代表这个流程图的开始节点,下面空的位置是用来添加活动用的。

 

一个Flowchart(流程图)活动和一个Sequence活动的主要不同点是它的子活动是怎么连接的。在第一章中,你添加活动到Sequence中,它们总是以从上到下的方式执行。你可以重新排列这些活动来控制它们的顺序,但是它们总是垂直一线地排列,而活动之间的箭头都是自动生成的。在Flowchart活动中,你可以任意摆放活动,更重要的是,你必须手动的画箭头。你可以画一个箭头到前一个活动。

在这个应用程序中,你将根据当天的时间输出一句问候语。首先输出一句标准的问候语“HelloWorld!”,拖拉一个WriteLine活动在绿色圆圈下面。设置DisplayName为“Hello”,Text属性为“HelloWorld!”。

 

定义连接

移动鼠标到绿色圆圈的上面,你会看见有四个灰色的连接点出现在绿色圆圈周围,如图Figure3-3所示。

 

 

 

点击其中一个连接点,保持鼠标下按,拖动鼠标到“Hello”活动,直到看到“Hello”活动出现连接点,如图Figure3-4所示。

 

你不必选择连接点,只要你见到连接点出现,你就知道对象已经被选择,松开鼠标,这时两个活动就会连接起来。如图Figure3-5所示。

 

你已经知道了怎么连接连个活动。移动鼠标到源活动,看见出现连接点,点击其中一个,拖动鼠标到终活动,当你看到终活动也出现连接点时,松开鼠标。

 

FlowDecision活动

拖动一个FlowDecision活动到“Hello”活动的下面。FlowDecision活动看起来像一个黄色的菱形。在属性窗口中,输入ConditionDateTime.Now.Hour >= 12。如果移动鼠标到FlowDecision活动的上面,你会看到连接点的出现。如图Figure3-6所示。

 

左边的连接点时true,右边的连接点是falseCondition属性也同样有显示出来。注意到在右上角有一个黄色的三角形。如果你点击它,Condition属性会显示出来,即使你的鼠标移开。你可以改变truefalse分支的名称。在属性窗口中,在FalseLabel属性中输入Morning,在TrueLabel属性中输入Afternoon。这时,当你鼠标移动到活动上时,你应该能看到MorningAfternoon

首先,连接“Hello”活动到FlowDecision活动(怎么连我就不说了)。然后拖一个WriteLineFlowDecision活动的右边,设置DisplayNameMorningText为“Good Morning”。接着按下FlowDecisionMorning连接点,拖动鼠标到“Morning”活动,直到看到出现连接点,松开鼠标。这时,你的图形应该如图Figure3-7所示。

 

提示:FlowDecision活动是没有Display属性的。但是,它可以显示Condition和编辑TrueFalse分支,目的是为了在图示中更加的明显。

拖拉另一个FlowDecision到第一个FlowDecision的左边。设置ConditionDateTime.Now.Hour >= 18。连接第一个FlowDecisionAfternoon分支到新的FlowDecision。设置FalseLabelAfternoonTrueLableEvening。拖拉两个WriteLine活动到设计器中,分别命名为AfternoonEvening,分别设置Text属性为“Good Afternoon”和“Good Evening”,连接第二个FlowDecisionEvening分支到“Evening”活动和Afternoon分支到“Afternoon”活动。你的流程图现在应该如图Figure3-8所示。

 

 

运行程序

在运行程序之前,打开Program.cs文件,在main()函数的最后添加以下代码:

 

            Console.WriteLine("Press ENTER to exit");

            Console.ReadLine();

 

这可以阻止程序退出。点击F5。根据时间的不同,你的结果类似于下面:

 

 

Flow Switch

FlowSwitch活动跟FlowDecision活动相似,但FlowSwitch没有限定于TrueFalse分支,你可以无上限的分支。它类似于C#中的switchFlowSwitch如图Figure3-9所示。

 

 

添加一个FlowSwitch活动

拖拉一个FlowSwitch活动到工作流的底部。FlowSwitch活动是一个模板类(注意到在toolbox中的<T>)因此你需要指定它的数据类型。指定它为Int32。连接“Morning”、“Afternoon”和“Evening”到FlowSwitch活动。FlowSwitch只有一个属性,名叫ExpressionExpression是用来判断走哪个分支的。在这个项目中,你会根据不同的季节去展示不同的问候语。在Expression属性中输入以下代码:

 

Cint(((DateTime.Now.Month Mod 12) + 1) / 4)

 

这个表达式的意思是根据当前日期返回当前是哪一个季节。如果是1212月,表达式会返回0。类似的,345月则返回1。现在你要创建四个分支,一个代表一个季节。

 

提示:当你把鼠标移动到FlowSwitch活动上面的时候,Expression将会显示出来,如图Figure3-10所示。跟FlowDecision活动一样,你可以点击黄色三角形,这样就可以保持Expression为显示状态。

 

 

 

添加FlowStep活动

FlowSwitch活动的每一个分支都叫FlowStep。虽然在Toolbox没有FlowStep活动,你不可以明确地添加这些分支到工作流中,但当你从FlowSwitch活动拖出一条连接线的时候,系统会自动地为你生成一个FlowStep。拖五个WriteLine活动到FlowSwitch活动附近。分别设置它们的DisplayNameWinterSpringSummerAutumnDefault。从FlowSwitch中五条连接线分别连接到这五个WriteLine活动。

点击其中一条连接线,在属性窗口中,你将根据不同的条件输入Case的值。对于“Winter”,Case的值应该为1;对于“Spring”,Case的值应该为2。对于“Default”活动,把IsDefaultCase的复选框选上,让Case值空着。

你的工作流图应该如图Figure3-11所示。

 

在每个WriteLine活动中输入他们的Text属性,如“Happy Summer”。“Default”活动是永远不会执行的,因为你已经定义了所有的可能。然而,如果Expression出现问题,“Default”活动就会起到一定的作用。输入“Default”活动的Text属性为:

 

“Season caluated as: ” + CInt(((DateTime.Now.Month Mod 12) + 1) / 4).ToString()

 

运行程序

点击F5运行程序,根据时间的不同,你的结果类似于:

 

 

Parallel活动

在结束这个项目之前,让我来演示一下Parallel活动吧。Parallel活动允许你定义很多活动序列在Parallel中运行。对于这个项目,每一个分支都展示不同的信息。它们的顺序不重要,他不是顺序地执行下去的,而是同时执行这些分支。

 

添加Parallel活动

拖放一个Parallel活动到工作流的底部。从每一个WriteLine上拖拉一条连接线到Parallel活动。你的工作流应该如图Figure3-12所示。

 

 

 

添加分支

双击Parallel活动,拖放三个WriteLine活动到它里面。其中一个WriteLine会展示日期;另一个会展示时间;最后一个会展示是星期几。在每个WriteLineText属性中分别输入以下表达式:

 

“Time: ” + DateTime.Now.TimeOfDay.ToString()

“Date: ” + DateTime.Now.Date.ToShortDateString()

“Tody is: ” + DateTime.Now.ToString(“dddd”)

 

这时图示应该如图Figure3-13所示:

 

 

提示:Parallel活动只允许一个活动在一个分支上,对于这个项目,他可以很好的运行,但是,如果你需要在每个分支上有多个活动,你可以使用Sequence活动,然后再Sequence活动中添加多个活动。

 

最终的工作流图如图Figure3-14所示:

 

 

运行程序

点击F5运行程序。结果类似于下面:

 

 

好像有错:在我翻译的时候,我发现在判断是哪一个季节的时候,好像有点对不上,不知道是我理解有问题还是原文有错,不过在我编写demo的时候,我发现真的对不上。所以我的demo跟原文有点出入。如果是我错了,请读者指出!

 

第三章源码下载

posted on 2011-08-02 08:47  Mayvar  阅读(659)  评论(1编辑  收藏  举报

导航