且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

工作流编程循序渐进(2:IfElseActivity活动)

更新时间:2022-09-22 23:32:54

工作流编程循序渐进(2:IfElseActivity活动)


作者  朱先忠

一、引言

本文中,我们来学习另一个简单活动--IfElseActivity。关于此活动,首先需要说明一下:

  • 借助于IfElseActivity活动,你可以创建工作流中的分支结构,每一个分支对应于一个IfElseBranehActivity分支。
  • IfElseActivitv活动可以有条件地选择执行多个IfElseBranchActivity分支中的一个。也就是说,对每个IfElseBranchActivity活动的执行,都必须被一个条件所激发。    ..
  • 对于IfElseBranchActivity活动的执行条件,如果该条件的计算结果为True,则会执行该IfElseBranchActivity活动中所包含的其他活动;如果计算结果为False,则会对一个IfElseBranehActivity条件进行计算,依此类推。
  • IfElseActivity活动的最后一个IfElseBranchActivity活动分支,会被视为Else分支,该分支不需要任何条件来进行激发。
  • 可通过IfElseBranchActivity活动的Condition属性,来为该活动设置条件,共有“代码条件“和“声明性规则条件”两个选项。    ’

你可以使用条件来控制工作流的行为。工作流引擎会判断条件,并依据判断的结果来决定之后的行为。在工作流中有两种表达条件的方式:
  1. 你可以编写一个处理方法并返回一个布尔值。
  2. 你可以在工作流中定义一个规则。
你可以在工作流的运行期间动态更新条件规则,来改变工作流的行为。
你也可以通过创建一个策略类型的活动,来使用条件行为。

条件规则只能是工作流类中定义任何公共成员——变量或者方法。而条件代码可以是任何公共或私有的成员。


下面,我们来构建一个简单的示例。

二、创建控制台顺序工作流示例程序框架


请遵循如下步骤创建一个控制台顺序工作流示例程序:
1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为
IfElseActivity的控制台顺序工作流示例程序,见下图。
工作流编程循序渐进(2:IfElseActivity活动)

2.之后,系统自动打开工作流设计器界面,如图所示。
工作流编程循序渐进(2:IfElseActivity活动)
3. 从工具箱中拖动IfElse活动到图中右侧的汉字提示处,得到如图所示的情形。
工作流编程循序渐进(2:IfElseActivity活动)

4. 显然,IfElse活动默认情况下添加了两个分支,这是最为常用和最简单的情形。其实,你还可以添加另外的更多的分支,以模拟类似于高级语言中的多分支语句switch情形。方法是右单击IfElse活动并选择“添加分支”即可。

工作流编程循序渐进(2:IfElseActivity活动)


5. 经过上面的操作后,你得到如下图所示的工作流:
工作流编程循序渐进(2:IfElseActivity活动)

[提示]:你可以在单击某个IfElseBranch活动后,通过选择属性窗口中的“左移”及“右移”选项调整此活动在图中的位置。

6.根据前面文章中介绍的几种简单活动,我们不妨再添加几个活动,得到如下图所示形式:
工作流编程循序渐进(2:IfElseActivity活动)

我们的设想很简单:出现一个提示让用户选择自己的角色,根据角色的不同,执行不同的简单活动。之后,通过一个Delay活动延迟3秒钟,按任意键然后结束。

下面,我们来讨论活动有关属性设置及编码问题。

三、活动有关属性设置及编码

1.单击最左边的IfElseBranch活动,在对应的属性对话框中指定Condition为“代码条件”,输入条件方法名为Condition1,如图所示:
工作流编程循序渐进(2:IfElseActivity活动)
然后,按下回车键,系统即自动跳转到此方法代码编辑处,输入如下内容:


        private void Condition1(object sender, ConditionalEventArgs e)
        {
            if (rolename.ToUpper() == "A")
                e.Result = true;
            else
                e.Result = false;
        }

类似地,设置中间IfElseBranch活动的触发条件也为代码条件,输入条件方法名为Condition2,相关代码为:


        private void Condition2(object sender, ConditionalEventArgs e)
        {
            if (rolename.ToUpper() == "C")
                e.Result = true;
            else
                e.Result = false;
        }

因为我们的例子中仅有三个条件,所以,前两种情况不满足时,便执行最后一个活动。因此,不必为之指定触发条件方法。

2.现在,依次设置上面图中从左向右三个子条件中Code活动的ExecuteCode方法代码如下:

        private void admin_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("您好,管理员!");
        }

        private void codeActivity3_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("您好,客户!");
        }

        private void passenger_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("您好,过客!");
        }


3. 设置codeActivity1活动ExecuteCode方法代码如下:

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("请选择您的角色:(C-普通客户;A-系统管理员;P-过客)");
            rolename = Console.ReadLine();
        }


4. 设置最后面那个codeActivity2活动ExecuteCode方法代码如下:


        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
            Console.Read();
        }



5. 另外,设置Delay活动延迟3秒钟非常简单,不赘述。
至此,完成了整个工作流部分的设计工作。非常直观简单!最后,别忘记把上面文件保存一下。

最后,我们来看一下控制台主程序是如何创建工作流实例,并启动工作流执行的。切换到
控制台主程序Program.cs。此时,系统已经为我们自动生成了如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;

namespace CodeAndDelay
{
    class Program
    {
        static void Main(string[] args)
        {
            //......经常在此添加一些初始化代码

            //创建工作流实例,并启动工作流执行。注意:工作流是以异步的独立的工作线程方式执行的
            using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                {
                    Console.WriteLine(e.Exception.Message);
                    waitHandle.Set();
                };

                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CodeAndDelay.Workflow1));
                instance.Start();

                waitHandle.WaitOne();
            }

            //......在此经常执行一些工作流执行后的善后工作

        }
    }
}


注意:有关上面代码中AutoResetEvent事件等的详细讨论将在后续文章中介绍。

四、运行实例

按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。

第一个界面:
工作流编程循序渐进(2:IfElseActivity活动)

接下字母a,并按下回车键,得到下图:
工作流编程循序渐进(2:IfElseActivity活动)


无他复杂设计,不再赘述。

五、小结

在本文中我们学习了IfElseActivity活动的使用过程,在下一篇中将学习另外几个基本活动--While活动,ConditionalActivityGroup活动,Replicator活动等待
















本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/203302 ,如需转载请自行联系原作者