WF 工作流(3)
在这一章,你将会使用流程图活动创建一个工作流。正如它的名字,一个流程图活动就如它是一个流程图,活动是用决策树来连接的。使用一个Sequence活动,它的子活动只可以从上到下的执行。而在一个流程图活动中,它的子活动可以用任意的顺序执行。
创建一个流程图工作流
创建一个项目,选择Workflow Console Application模板,如图Figure3-1所示。
设计流程图
拖拉一个Flowchart活动到设计器重。初始的图形类似于Figure3-2。绿色的圆圈代表这个流程图的开始节点,下面空的位置是用来添加活动用的。
一个Flowchart(流程图)活动和一个Sequence活动的主要不同点是它的子活动是怎么连接的。在第一章中,你添加活动到Sequence中,它们总是以从上到下的方式执行。你可以重新排列这些活动来控制它们的顺序,但是它们总是垂直一线地排列,而活动之间的箭头都是自动生成的。在Flowchart活动中,你可以任意摆放活动,更重要的是,你必须手动的画箭头。你可以画一个箭头到前一个活动。
在这个应用程序中,你将根据当天的时间输出一句问候语。首先输出一句标准的问候语“Hello,World!”,拖拉一个WriteLine活动在绿色圆圈下面。设置DisplayName为“Hello”,Text属性为“Hello,World!”。
定义连接
移动鼠标到绿色圆圈的上面,你会看见有四个灰色的连接点出现在绿色圆圈周围,如图Figure3-3所示。
点击其中一个连接点,保持鼠标下按,拖动鼠标到“Hello”活动,直到看到“Hello”活动出现连接点,如图Figure3-4所示。
你不必选择连接点,只要你见到连接点出现,你就知道对象已经被选择,松开鼠标,这时两个活动就会连接起来。如图Figure3-5所示。
你已经知道了怎么连接连个活动。移动鼠标到源活动,看见出现连接点,点击其中一个,拖动鼠标到终活动,当你看到终活动也出现连接点时,松开鼠标。
FlowDecision活动
拖动一个FlowDecision活动到“Hello”活动的下面。FlowDecision活动看起来像一个黄色的菱形。在属性窗口中,输入Condition为DateTime.Now.Hour >= 12。如果移动鼠标到FlowDecision活动的上面,你会看到连接点的出现。如图Figure3-6所示。
左边的连接点时true,右边的连接点是false。Condition属性也同样有显示出来。注意到在右上角有一个黄色的三角形。如果你点击它,Condition属性会显示出来,即使你的鼠标移开。你可以改变true和false分支的名称。在属性窗口中,在FalseLabel属性中输入Morning,在TrueLabel属性中输入Afternoon。这时,当你鼠标移动到活动上时,你应该能看到Morning和Afternoon。
首先,连接“Hello”活动到FlowDecision活动(怎么连我就不说了)。然后拖一个WriteLine到FlowDecision活动的右边,设置DisplayName为Morning,Text为“Good Morning”。接着按下FlowDecision的Morning连接点,拖动鼠标到“Morning”活动,直到看到出现连接点,松开鼠标。这时,你的图形应该如图Figure3-7所示。
提示:FlowDecision活动是没有Display属性的。但是,它可以显示Condition和编辑True和False分支,目的是为了在图示中更加的明显。
拖拉另一个FlowDecision到第一个FlowDecision的左边。设置Condition为DateTime.Now.Hour >= 18。连接第一个FlowDecision的Afternoon分支到新的FlowDecision。设置FalseLabel为Afternoon,TrueLable为Evening。拖拉两个WriteLine活动到设计器中,分别命名为Afternoon和Evening,分别设置Text属性为“Good Afternoon”和“Good Evening”,连接第二个FlowDecision的Evening分支到“Evening”活动和Afternoon分支到“Afternoon”活动。你的流程图现在应该如图Figure3-8所示。
运行程序
在运行程序之前,打开Program.cs文件,在main()函数的最后添加以下代码:
Console.WriteLine("Press ENTER to exit");
Console.ReadLine();
这可以阻止程序退出。点击F5。根据时间的不同,你的结果类似于下面:
Flow Switch
FlowSwitch活动跟FlowDecision活动相似,但FlowSwitch没有限定于True和False分支,你可以无上限的分支。它类似于C#中的switch。FlowSwitch如图Figure3-9所示。
添加一个FlowSwitch活动
拖拉一个FlowSwitch活动到工作流的底部。FlowSwitch活动是一个模板类(注意到在toolbox中的<T>)因此你需要指定它的数据类型。指定它为Int32。连接“Morning”、“Afternoon”和“Evening”到FlowSwitch活动。FlowSwitch只有一个属性,名叫Expression。Expression是用来判断走哪个分支的。在这个项目中,你会根据不同的季节去展示不同的问候语。在Expression属性中输入以下代码:
Cint(((DateTime.Now.Month Mod 12) + 1) / 4)
这个表达式的意思是根据当前日期返回当前是哪一个季节。如果是12、1、2月,表达式会返回0。类似的,3、4、5月则返回1。现在你要创建四个分支,一个代表一个季节。
提示:当你把鼠标移动到FlowSwitch活动上面的时候,Expression将会显示出来,如图Figure3-10所示。跟FlowDecision活动一样,你可以点击黄色三角形,这样就可以保持Expression为显示状态。
添加FlowStep活动
FlowSwitch活动的每一个分支都叫FlowStep。虽然在Toolbox没有FlowStep活动,你不可以明确地添加这些分支到工作流中,但当你从FlowSwitch活动拖出一条连接线的时候,系统会自动地为你生成一个FlowStep。拖五个WriteLine活动到FlowSwitch活动附近。分别设置它们的DisplayName为Winter、Spring、Summer、Autumn和Default。从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会展示日期;另一个会展示时间;最后一个会展示是星期几。在每个WriteLine的Text属性中分别输入以下表达式:
“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跟原文有点出入。如果是我错了,请读者指出!