zoukankan      html  css  js  c++  java
  • 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跟原文有点出入。如果是我错了,请读者指出!

     

    第三章源码下载

  • 相关阅读:
    线性判别分析(LDA)
    奇异值分解(SVD)
    傅里叶变换
    SVM 之非线性支持向量机
    三角函数常用公式
    协方差、样本协方差和协方差矩阵
    方差和样本方差
    SVM 之线性支持向量机
    参考资料汇总
    QObject: Cannot create children for a parent that is in a different thread
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua201108020843.html
Copyright © 2011-2022 走看看