简单状态机模式工作流演示

在状态机模式下使用State,EventDriven,Code,ifElse,While
新建项目
1.新建Emplu Workflow Project 名为WorkflowProject1

2.添加State Machine Workflow文件

3.将系统默认建立的Workflow1InitialState删除,自已建可以感受一下过程

添加State结点

每个State Machine Workflow至少要有两个stateActivity,

一个为初始状态:initial State

一个为完成状态:completed State

initial State

初始状态,必需有且只有一个,添加正常状态后,右击,选 Set as Initial State

可以对其内部进行设计

completed State

完成状态,必需有且只有一个,添加正常状态后,右击,选 Set as Completed State

不能对其内部进行设计,作为一个终结点标志

Node State

添加的正常状态,可以有任意多个,与initial State一样可以对其内部进行设计

为State结点添加EventDriven

只有initial State与Node State可添加EventDriven

设计EventDriven

EventDriven容器里的结点

delay

每个EventDriven容器开始处必需有该结点。

setState

每个EventDriven容器都应有该结点。

用于设置该状态完成后的下一个State结点

在EventDriven里添加Code结点

在EventDriven里添加ifElse结点

1.ifElse结点两个分支容器内可添加其他结点

2.ifElse需要为if的分支指定conditions(状态)


在EventDriven里添加While结点

1.While结点循环容器内可添加其他结点

2.While需要为循环条件指定conditions(状态)

完成ifElse结点两个分支内的代码,与While结点内的循环代码,最后结果如下

代码部分:

Workflow1.designer.cs:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Reflection;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace WorkflowLibrary1
{
    partial class Workflow1
    {
		#region Designer generated code
        
        /// <summary> 
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCode]
        private void InitializeComponent()
        {
            this.CanModifyActivities = true;
            System.Workflow.Activities.Rules.RuleConditionReference ruleconditionreference1 = new System.Workflow.Activities.Rules.RuleConditionReference();
            System.Workflow.Activities.Rules.RuleConditionReference ruleconditionreference2 = new System.Workflow.Activities.Rules.RuleConditionReference();
            this.codeActivity4 = new System.Workflow.Activities.CodeActivity();
            this.whileActivity1 = new System.Workflow.Activities.WhileActivity();
            this.codeActivity3 = new System.Workflow.Activities.CodeActivity();
            this.codeActivity2 = new System.Workflow.Activities.CodeActivity();
            this.ifElseBranchActivity2 = new System.Workflow.Activities.IfElseBranchActivity();
            this.ifElseBranchActivity1 = new System.Workflow.Activities.IfElseBranchActivity();
            this.setStateActivity2 = new System.Workflow.Activities.SetStateActivity();
            this.ifElseActivity1 = new System.Workflow.Activities.IfElseActivity();
            this.delayActivity2 = new System.Workflow.Activities.DelayActivity();
            this.setStateActivity1 = new System.Workflow.Activities.SetStateActivity();
            this.codeActivity1 = new System.Workflow.Activities.CodeActivity();
            this.delayActivity1 = new System.Workflow.Activities.DelayActivity();
            this.eventDrivenActivity2 = new System.Workflow.Activities.EventDrivenActivity();
            this.eventDrivenActivity1 = new System.Workflow.Activities.EventDrivenActivity();
            this.stateActivity3 = new System.Workflow.Activities.StateActivity();
            this.stateActivity2 = new System.Workflow.Activities.StateActivity();
            this.stateActivity1 = new System.Workflow.Activities.StateActivity();
            // 
            // codeActivity4
            // 
            this.codeActivity4.Name = "codeActivity4";
            this.codeActivity4.ExecuteCode += new System.EventHandler(this.codeActivity4_ExecuteCode);
            // 
            // whileActivity1
            // 
            this.whileActivity1.Activities.Add(this.codeActivity4);
            ruleconditionreference1.ConditionName = "条件2";
            this.whileActivity1.Condition = ruleconditionreference1;
            this.whileActivity1.Name = "whileActivity1";
            // 
            // codeActivity3
            // 
            this.codeActivity3.Name = "codeActivity3";
            this.codeActivity3.ExecuteCode += new System.EventHandler(this.codeActivity3_ExecuteCode);
            // 
            // codeActivity2
            // 
            this.codeActivity2.Name = "codeActivity2";
            this.codeActivity2.ExecuteCode += new System.EventHandler(this.codeActivity2_ExecuteCode);
            // 
            // ifElseBranchActivity2
            // 
            this.ifElseBranchActivity2.Activities.Add(this.codeActivity3);
            this.ifElseBranchActivity2.Activities.Add(this.whileActivity1);
            this.ifElseBranchActivity2.Name = "ifElseBranchActivity2";
            // 
            // ifElseBranchActivity1
            // 
            this.ifElseBranchActivity1.Activities.Add(this.codeActivity2);
            ruleconditionreference2.ConditionName = "条件1";
            this.ifElseBranchActivity1.Condition = ruleconditionreference2;
            this.ifElseBranchActivity1.Name = "ifElseBranchActivity1";
            // 
            // setStateActivity2
            // 
            this.setStateActivity2.Name = "setStateActivity2";
            this.setStateActivity2.TargetStateName = "stateActivity3";
            // 
            // ifElseActivity1
            // 
            this.ifElseActivity1.Activities.Add(this.ifElseBranchActivity1);
            this.ifElseActivity1.Activities.Add(this.ifElseBranchActivity2);
            this.ifElseActivity1.Name = "ifElseActivity1";
            // 
            // delayActivity2
            // 
            this.delayActivity2.Name = "delayActivity2";
            this.delayActivity2.TimeoutDuration = System.TimeSpan.Parse("00:00:00");
            // 
            // setStateActivity1
            // 
            this.setStateActivity1.Name = "setStateActivity1";
            this.setStateActivity1.TargetStateName = "stateActivity2";
            // 
            // codeActivity1
            // 
            this.codeActivity1.Name = "codeActivity1";
            this.codeActivity1.ExecuteCode += new System.EventHandler(this.codeActivity1_ExecuteCode);
            // 
            // delayActivity1
            // 
            this.delayActivity1.Name = "delayActivity1";
            this.delayActivity1.TimeoutDuration = System.TimeSpan.Parse("00:00:00");
            // 
            // eventDrivenActivity2
            // 
            this.eventDrivenActivity2.Activities.Add(this.delayActivity2);
            this.eventDrivenActivity2.Activities.Add(this.ifElseActivity1);
            this.eventDrivenActivity2.Activities.Add(this.setStateActivity2);
            this.eventDrivenActivity2.Name = "eventDrivenActivity2";
            // 
            // eventDrivenActivity1
            // 
            this.eventDrivenActivity1.Activities.Add(this.delayActivity1);
            this.eventDrivenActivity1.Activities.Add(this.codeActivity1);
            this.eventDrivenActivity1.Activities.Add(this.setStateActivity1);
            this.eventDrivenActivity1.Name = "eventDrivenActivity1";
            // 
            // stateActivity3
            // 
            this.stateActivity3.Name = "stateActivity3";
            // 
            // stateActivity2
            // 
            this.stateActivity2.Activities.Add(this.eventDrivenActivity2);
            this.stateActivity2.Name = "stateActivity2";
            // 
            // stateActivity1
            // 
            this.stateActivity1.Activities.Add(this.eventDrivenActivity1);
            this.stateActivity1.Name = "stateActivity1";
            // 
            // Workflow1
            // 
            this.Activities.Add(this.stateActivity1);
            this.Activities.Add(this.stateActivity2);
            this.Activities.Add(this.stateActivity3);
            this.CompletedStateName = "stateActivity3";
            this.DynamicUpdateCondition = null;
            this.InitialStateName = "stateActivity1";
            this.Name = "Workflow1";
            this.CanModifyActivities = false;

        }

        #endregion

        private CodeActivity codeActivity4;
        private WhileActivity whileActivity1;
        private DelayActivity delayActivity2;
        private IfElseBranchActivity ifElseBranchActivity2;
        private IfElseBranchActivity ifElseBranchActivity1;
        private SetStateActivity setStateActivity2;
        private IfElseActivity ifElseActivity1;
        private CodeActivity codeActivity3;
        private CodeActivity codeActivity2;
        private SetStateActivity setStateActivity1;
        private DelayActivity delayActivity1;
        private EventDrivenActivity eventDrivenActivity2;
        private EventDrivenActivity eventDrivenActivity1;
        private StateActivity stateActivity3;
        private StateActivity stateActivity2;
        private CodeActivity codeActivity1;
        private StateActivity stateActivity1;
    }
}

 

Workflow1.cs:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace WorkflowLibrary1
{
	public sealed partial class Workflow1: StateMachineWorkflowActivity
	{
		public Workflow1()
		{
			InitializeComponent();
		}

        public String wxd_state = "wxd";
        public Int32 wxd_i = 0;
        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            System.Console.WriteLine("begin Initial node code");
            wxd_state = "12f3";
            System.Console.WriteLine("为SM_State赋值123");
            Console.WriteLine("End Initialcode 节点代码");
        }

        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
            System.Console.WriteLine("开始cood2结点代码");
            System.Console.WriteLine("如果wxd_state值为将执行该结点");
            System.Console.WriteLine(wxd_state);
            System.Console.WriteLine("结束cood3结点代码");
        }

        private void codeActivity3_ExecuteCode(object sender, EventArgs e)
        {
            System.Console.WriteLine("开始cood3结点代码");
            System.Console.WriteLine("如果wxd_state值不为将执行该结点");
            System.Console.WriteLine(wxd_state);
            System.Console.WriteLine("结束cood3结点代码");
        }

        private void codeActivity4_ExecuteCode(object sender, EventArgs e)
        {
            this.wxd_i += 1;
            System.Console.WriteLine(wxd_i.ToString());
        }
	}

}

 

输出类 Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.Activities;

namespace ConsoleApplication1
{
    class Program
    {
        static AutoResetEvent WaitHandle = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            Program game = new Program();
            game.RunGameWF();
        }

        public void RunGameWF()
        {
            using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
                workflowRuntime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(WorkflowRuntime_WorkflowTerminated);

                WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
                workflowInstance.Start();
                WorkflowInstance workflowInstance2 = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
                workflowInstance2.Start();
                WaitHandle.WaitOne();
            }
            Console.WriteLine("完成");
            Console.ReadLine();
        }
        public void WorkflowRuntime_WorkflowCompleted(Object sender, WorkflowCompletedEventArgs e)
        {
            WaitHandle.Set();
        }
        public void WorkflowRuntime_WorkflowTerminated(Object sender, WorkflowTerminatedEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
            WaitHandle.Set();
        }
    }
}

一个简单的态机模式工作流演示

一个简单的态机模式工作流演示(2)(代码与实现)

posted on 2010-12-23 11:26  greentea  阅读(532)  评论(0编辑  收藏  举报

导航