一、顺序工作流

  顺序活动是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 = ;

        public Workflow1()
{
InitializeComponent();
} private void ifElseBranch1Judge(object sender, ConditionalEventArgs e)
{
//小于10,则走这条线路
e.Result = iCondition < ;
} 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 = ; 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 < ;
}
}

  输出:

  

四、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 = ; 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 = ;
public int Over
{
get { return over; }
set { over = value; }
} private int condition = ;
public int Condition
{
get { return condition; }
set { condition = value; }
} public Workflow1()
{
InitializeComponent();
} private void Code1(object sender, EventArgs e)
{ Console.WriteLine("顺序1执行!");
Condition = Condition + ;
} private void Code2(object sender, EventArgs e)
{
Console.WriteLine("顺序2执行!");
Condition = Condition + ;
} private void Code3(object sender, EventArgs e)
{
Console.WriteLine("顺序3执行!");
Condition = Condition + ;
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无效。

  

WWF3控制流程类型活动<第二篇>的更多相关文章

  1. 深入理解DOM事件类型系列第二篇——键盘事件

    × 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...

  2. linux bash编程之算数运算和测试类型(第二篇)

    写在最前边:在bash中数据类型有两种,分别是数值型和字符型.其中字符型是默认的. 1.算数运算 · 运算符 · 语法 1.1.运算符:+.-.*./.%.** 注意:有些时候 *(乘号)需要转义 1 ...

  3. WWF3事件类型活动<第三篇>

    WWF将工作流分为两大类: 面向Human:在工作流运行时通过用户对外部应用程序的操作来影响工作流的业务流转. 面向System:应用程序控制流程. 工作流与应用程序都是可以单独存在的,因此它们之间的 ...

  4. PHP丨PHP基础知识之流程控制WHILE循环「理论篇」

    昨天讲完FOR循环今天来讲讲他的兄弟WHILE循环!进入正题: while是计算机的一种基本循环模式.当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环.while语句的一般表达式为:whil ...

  5. C# 8.0和.NET Core 3.0高级编程 分享笔记三:控制流程和转换类型

    控制流程和转换类型 本章的内容主要包括编写代码.对变量执行简单的操作.做出决策.重复执行语句块.将变量或表达式值从一种类型转换为另一种类型.处理异常以及在数值变量中检查溢出. 本章涵盖以下主题: 操作 ...

  6. “全栈2019”Java第二十二章:控制流程语句中的决策语句if-else

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. 第二篇 界面开发 (Android学习笔记)

    第二篇 界面开发 第5章 探索界面UI元素 ●The Android View Class     ●△Widget设计步骤 需要修改三个XML,以及一个class: 1)第一个xml是布局XML文件 ...

  8. ElasticSearch查询 第二篇:文档更新

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  9. EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念

    目录 1. 使用Anypoint Studio开发 2. Mule ESB Application Structure - Mule ESB应用程序结构 3. Mule ESB Application ...

随机推荐

  1. The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved

    偶在页面里引入了标签如下:     <%@   taglib   prefix="c"   uri="http://java.sun.com/jstl/core&q ...

  2. onclick事件对动态参数类型为字符串的处理

    onclick="solveRow("'+row.isbesolve+'")"

  3. MST_prim

    刚刚发了mst 的kruskal,现在再来一发,说一说prim咯. prim适用于稠密图. 与kruskal不同,prim是从一个点开始,不断加入新的点直至连通所有点. 讲讲prim的过程,我们假定有 ...

  4. js复习(二)

    一.window.document对象(一)找元素 docunment.getElementById("id"):根据id找,最多找一个: docunment.getElement ...

  5. UCOS时钟与中断:

    OSTimeDly() OSTimeDlyHMSM()上面的函数除了延时功能,主要是会进入任务调度. OSTimeDlyHResume()当某条件达到之后需要停止周期性延时调用该函数. 当调用延时函数 ...

  6. JAVA 拆分窗口

    //拆分窗口 import java.awt.*; import javax.swing.*; public class Jiemian8 extends JFrame{ JSplitPane cf; ...

  7. WCF Windows Service Using TopShelf and ServiceModelEx z

    http://lourenco.co.za/blog/2013/08/wcf-windows-service-using-topshelf-and-servicemodelex/ There are ...

  8. PHP 时区设置

    有时候使用date("Y-m-d h:i:s")时发现时间相差8小时,修改“/etc/php5/apache2/php.ini”: date.timezone = "As ...

  9. 微信JSSDK上传多张图片

    之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid ...

  10. python 之 模拟GET/POST提交

    以 POST/GET 方式向 http://127.0.0.1:8000/test/index 提交数据. # coding:utf-8 import httplib import urllib cl ...