C军

不玩博客了!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、顺序工作流

  顺序活动是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无效。

  

 

posted on 2014-09-02 18:25  逆心  阅读(798)  评论(0编辑  收藏  举报