一、顺序工作流
顺序活动是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:如果规则的判断条件被修改后,则会被重新应用 |
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无效。