博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WWF3控制流程类型活动<第二篇>
阅读量:7088 次
发布时间:2019-06-28

本文共 8153 字,大约阅读时间需要 27 分钟。

一、顺序工作流

  顺序活动是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 + "\r\n" + 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无效。

  

 

转载地址:http://umyql.baihongyu.com/

你可能感兴趣的文章
阿里云MVP第八期全球发布,一起出发走向未来
查看>>
我们的手机用上北斗导航了吗?
查看>>
改变ListBoxItem选中的颜色
查看>>
老罗自掏腰包为开源社区捐款,并表示锤子将自己编写OS
查看>>
mysql主从复制(半同步方式)
查看>>
6年来,Docker的这些变化你都知道吗?
查看>>
支付宝客户端架构解析:iOS 客户端启动性能优化初探
查看>>
Maven之pom.xml配置文件详解(转载)
查看>>
优化Git本地仓库
查看>>
对.NET Core未来发展趋势的浅层判断
查看>>
Python高级知识点学习(七)
查看>>
《人月神话》(P7)编写手册和组织开会
查看>>
WPF如何实现一个漂亮的页签导航UI
查看>>
Dubbo+zookeeper实现分布式服务框架
查看>>
HTML编码规范
查看>>
游戏开发者福音:微软开源部分 Minecraft 的 Java 代码
查看>>
Firefox 66 存在使 PPT 文字消失的 bug,v68 才修复
查看>>
Android 三星手机拍照,从图库选择照片旋转问题完美解决
查看>>
在线表格 x-spreadsheet 1.0.16 发布
查看>>
PostgreSQL 多值列的选择性 - Statistics, Cardinality, Selectivity, Estimate
查看>>