zoukankan      html  css  js  c++  java
  • WWF3控制流程类型活动<第二篇>

    一、顺序工作流

      顺序活动是WWF工作流中最基本、最简单的容器类型的活动。顺序活动可以作为很多其他活动的分支。

      

      代码:

            private void CodeExecute1(object sender, EventArgs e)
            {
                Console.WriteLine("顺序工作流第一步!");
            }
    
            private void CodeExecute2(object sender, EventArgs e)
            {
                Console.WriteLine("顺序工作流第二步!");
            }
    
            private void CodeExecute3(object sender, EventArgs e)
            {
                Console.WriteLine("顺序工作流第三步!");
                Console.ReadKey();
            }

      效果:

      

    二、ifElse

      ifElse活动是一个容器类型的符合活动,它的每个分支都由顺序活动构成。在设计工作流的时候,如果遇到逻辑判断的情况,那么就可以通过ifElse活动来实现。

      

      在工具箱中,拖入一个ifElse后,属性,Condition中选择"代码条件",然后会多一个Condition,这时候输入事件名"ifElseBranch1Judge"回车,就能够键入判断代码。

            private int iCondition = 90;
    
            public Workflow1()
            {
                InitializeComponent();
            }
    
            private void ifElseBranch1Judge(object sender, ConditionalEventArgs e)
            {
                //小于10,则走这条线路
                e.Result = iCondition < 10;
            }
    
            private void codeActivity1_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("小于10的线路");
            }
    
            private void codeActivity2_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("大于10的线路");
                Console.ReadKey();
            }

      当只有两个分支时,只要不满足第一条,则自动走第二条。当有多个分支时,前面的不满足则自动执行最后一条。

      

      如果采用声明规则的方式,那么方法如下:

      

    三、While

      While活动是一个容器类型的符合活动,它是一个典型的基于规则的工作流模式。

      While活动中有一个关键属性"Conditions",该属性页同样提供两种方式来定义其循环的判断条件,分别是"Code Condition"方式和"Declarative Rule Condition"方式。它们的使用方法与ifElse活动中定义逻辑判断的方式相同。

      

      代码:

       public sealed partial class Workflow1 : SequentialWorkflowActivity
        {
            private int i = 0;
    
            public Workflow1()
            {
                InitializeComponent();
            }
    
            private void ExecuteCode_1(object sender, EventArgs e)
            {
                i++;
                Console.WriteLine(string.Format("当前循环第{0}次",i));
            }
    
            private void whileCondition(object sender, ConditionalEventArgs e)
            {
                e.Result = i < 3;
            }
        }

      输出:

      

    四、Policy

      Policy活动的使用有点类似于ifElse以“声明规则条件”方式进行逻辑判断。但它们的区别在于Policy活动是一组逻辑 规则的集合,在规则集合内的每个规则都可以通过"Then Actions"来执行逻辑判断结果为“真”时需要的操作, 在“Else Actions”内来执行当逻辑判断结果为“假”时所需的操作。

      Policy活动有一个必须设置的属性"RuleSetReference",用户点击"RuleSetReference"属性中的...按钮,在弹出的对话框内可以管理或创建逻辑判断规则的集合"RuleSet",但Policy活动只能使用一个"RuleSet"逻辑判断规则的集合。在每个"RuleSet"中又可以创建多个判断规则"Rule"。点击New按钮来I型年间一个逻辑判断规则。

      Rule规则属性

    字段名称 含义
    Priority 以整型数字来设置Rule的优先权,其值越大优先级就越高,例如:-1比0的优先级低,0比1的优先级低。优先级高的Rule将优先被执行。
    Active 代表是否启用规则
    Reevaluation

    是否对规则的判断条件进行重新应用

    Always:如果规则的判断条件被修改后,则会被重新应用
    Never:如果规则的判断条件被修改后,则不会被重新应用

    Condition  编写规则的判断表达式,当表达式为“真”时,就执行“Then Actions”中的操作,为“假”时就执行“Else Actions”中的操作。
    Then Actions  规则的判断条件为“真”时,将要执行的操作。
    Else Actions  规则的判断条件为“假”时,将要执行的操作。

      示例:

      

      规则:

      

      代码:

        public sealed partial class Workflow1 : SequentialWorkflowActivity
        {
            private int iRuleValue = 0;
    
            public Workflow1()
            {
                InitializeComponent();
            }
        }

      输出:

      

      由于规则2的优先级较高,所以程序优先执行规则2,然后再执行规则1,如果执行完规则2后,不想再执行规则1,那么可以执行完规则2后,将参数iRuleValue改为不符合规则1的条件。

    五、ConditionedActivityGroup

      ConditionedActivityGroup活动是一个容器类型的活动,它将若干个工作流活动组合起来形成一个活动的集合。ConditionedActivityGroup活动为它容器内部的每个子活动都增加了一个"WhenCondition"附加属性,只有在ConditionedActivityGroup容器内的子活动才具有该属性。

      当ConditionedActivityGroup活动内的子活动"WhenCondition"属性的判断结果为真时,该子活动就被执行。而"UntilCondition"属性为真时,ConditionedActivityGroup连同其内部的子活动都停止执行。

      

      这是一个ConditionedActivityGroup,里面包含了3个Code子活动,分别设置属性如下:

    活动名称 属性名称 逻辑判断条件
    codeActivity1 WhenCondition this.Condition == 1
    codeActivity2 WhenCondition this.Condition == 2
    codeActivity3 WhenCondition this.Condition == 3
    ConditionedActivityGroup1 UntilCondition this.Condition == this.Over + 1

      代码如下:

        public sealed partial class Workflow1 : SequentialWorkflowActivity
        {
            private int over = 4;
            public int Over
            {
                get { return over; }
                set { over = value; }
            }
    
            private int condition = 1;
            public int Condition
            {
                get { return condition; }
                set { condition = value; }
            }
    
            public Workflow1()
            {
                InitializeComponent();
            }
    
            private void Code1(object sender, EventArgs e)
            {
    
                Console.WriteLine("顺序1执行!");
                Condition = Condition + 1;
            }
    
            private void Code2(object sender, EventArgs e)
            {
                Console.WriteLine("顺序2执行!");
                Condition = Condition + 1;
            }
    
            private void Code3(object sender, EventArgs e)
            {
                Console.WriteLine("顺序3执行!");
                Condition = Condition + 1;
                Console.ReadKey();
            }
        }

      以上流程非常简单,当Condition为1、2、3时,分别执行各自流程,然后自增(为了执行下一个)。然后Condition自增到4时,跳出ConditionedActivityGroup,继续往下执行。

    六、Replicator

      Replicator活动属于容器类型的复合活动,但该活动内只能容纳一个子活动。Replicator活动的用途是在运行时复制它内部的子活动,具体复制数量由"InitialChildData"属性确定,该数量一般是只有等到工作流运行时才知道。在运行时Replicator活动将通过"ChildInitialized"和"ChildCompleted"事件与其内部的子活动进行数据交换。在Replicator活动运行时还可以通过"ExecutionType"属性来设置复制出来的子活动实例之间的运行关系,即“顺序执行”还是“平行执行”。如果用户设置了“UntilCondition”属性,那么当满足条件时Replicator活动将会取消或中断正在运行的所有实例。

    • InitialChildData:复制数量;
    • "ChildInitialized"和"ChildCompleted"事件与内部的子活动进行数据交换;
    • ExecutionType复制出来的子活动实例之间的运行关系
    • UntilCondition满足条件时Replicator活动将会取消或中断正在运行的所有实例。

      拖入一个Replicator,然后在Replicator里面拖入一个Code活动。

      通过Initialized属性创建一个事件,该事件在Replicator活动初始化时处罚,一般可在该事件内确定Replicatoe活动复制子活动的个数。如果用户一早已经知道所需复制次数,那么也可以通过Replicator活动的"CurrentChildData"属性进行设置。

      通过"ChildInitialized"属性来创建的事件实在Replicator容器中子活动的实例被创建时触发。用户可以利用该事件"ReplicatorChildEventArgs"类型的参数"e"得到当前所复制的子活动的实例:e.Activity和数据e.InstanceData。

      

      

      

      代码如下:

        public sealed partial class Workflow1 : SequentialWorkflowActivity
        {
            string voter;
            string voterAll;
    
            private ArrayList arry;
            public ArrayList Arry
            {
                get { return arry; }
                set { arry = value; }
            }
    
            public Workflow1()
            {
                InitializeComponent();
            }
    
    
            //顺序流事件
            private void Code(object sender, EventArgs e)
            {
                voterAll = voterAll + "
    " + voter;
            }
    
            //Replicator初始化事件
            private void Init(object sender, EventArgs e)
            {
                Arry = new ArrayList();
                Arry.Add("张三");
                Arry.Add("李四");
                replicatorActivity1.InitialChildData = Arry;
            }
    
            //Replicator完成事件
            private void Complete(object sender, EventArgs e)
            {
                Console.WriteLine("最终参加投票的人有:" + voterAll);
                Console.ReadKey();
            }
    
            //子活动开始事件
            private void ChildIni(object sender, ReplicatorChildEventArgs e)
            {
                voter = (string)e.InstanceData;
            }
    
            //子活动完成事件
            private void ChildComplete(object sender, ReplicatorChildEventArgs e)
            {
                Console.WriteLine(voter + "参与了投票!");
            }
        }

      说明:

      //这三行代码是在工作流里初始化参数的:
      Arry = new ArrayList();
      Arry.Add("张三");
      Arry.Add("李四");
      //如果是在外部调用此工作流时,可以这样代参数调用
      Arry = new ArrayList();
      Arry.Add("张三");
      Arry.Add("李四");
      wfruntime = new WorkflowRuntime();
      wfruntime.StartRuntime();
      wfinstance = wfruntime.CreateWorkflow(wfType,parameters);
      wfinstance.Start();

    七、SynchronizationScope和Parallel

      SynchronizationScope活动也是一个容器类型的符合活动,它可以为每个分支设置一个"排他"的标记"SynchronizationHandlers"。具有相同"排他"标记的分支相对于其他具有"排他"标记的分支来说是相对独立的运行集合,只有该集合内的所有活动全部运行完毕后,下一组具有相同"排他"标记的集合才会执行。

      

      代码:

        public sealed partial class Workflow1 : SequentialWorkflowActivity
        {
            public Workflow1()
            {
                InitializeComponent();
            }
            private void codeActivity1_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("Code1执行");
            }
            private void codeActivity2_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("Code2执行");
            }
            private void codeActivity3_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("Code3执行");
            }
            private void codeActivity4_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("Code4执行");
                Console.ReadKey();
            }
        }

      输出:

      

      从以上的执行顺序来看,Parallel活动的执行顺序为从左至右依次执行,每次执行一个分支上的一个子活动,直至Parallel活动上的所有子活动全部执行完毕为止。

      注意顺序。

      如果我们在左右两边的Code之间,增加一个SynchronizationScope。

      

      那么执行顺序如下:

      

      注意要设置相同的“排他”标记,否则SynchronizationScope无效。

      

  • 相关阅读:
    0625jQuery练习:权限基础1:查询员工对应角色、修改员工对应角色
    0624jQuery练习:三级联动—时间
    0622jQuery基础:常用属性
    0621jQuery基础:基础属性
    0621jQuery练习:三级联动
    0621jQuery练习:弹窗
    0621jQuery基础:事件
    数据库连接-登录
    javaScript中的DOM操作及数组的使用
    设置日期对象(年-月-日 时-分-秒)实现菱形的拼接
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3952079.html
Copyright © 2011-2022 走看看