探索工作流(二)--状态工作流 My Workflow Trip

来源:互联网 发布:分期系统商城源码 编辑:程序博客网 时间:2024/06/08 00:16
上篇文章简要介绍了工作流的基本知识,这片文章我们开始工作流之旅,第一个工作流程序--MyWorkflowTrip。

1 新建一个状态机工作流控制台应用程序,也就是审批流项目,需要在.NET Framework3.5版本下创建项目。


2 首先我们来看一下程序入口代码,这里已经为我们初始化好了部分代码,包括创建工作流引擎实例、注册工作流相关操作及创建和启动工作流实例,我们只需要创建我们的流程内容即可。


class Program    {        static void Main(string[] args)        {            //创建工作流引擎实例            using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())            {                //创建线程锁                AutoResetEvent waitHandle = new AutoResetEvent(false);                //注册工作流实例完成时执行的事件                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)                {                    waitHandle.Set();                };                //注册工作流实例被终止时执行的事件                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)                {                    Console.WriteLine(e.Exception.Message);                    waitHandle.Set();                };                //创建工作流实例                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1));                instance.Start();                //阻塞当前线程                waitHandle.WaitOne();            }        }    }

3 打开流程设计器workflow1.cs文件,从左边工具栏直接拖拽出节点state,生成三个stateActivity节点,并且分别在每个节点上单击右键,选中添加eventDriven为此节点添加一个eventDrivenActivity事件。


4 双击eventDrivenActivity1,打开当前节点,从左边工具箱添加一个Delay时间控件,在属性对话框中设置延迟时间为1秒钟。


5 在左侧工具箱中添加一个Code输出控件,并且再添加一个SetState设置下一节点控件。在左侧属性窗口设置SetState的TargetStateName属性为第二个节点名称stateActivity2。


6 分别双击delayActivity和codeActivity控件,在代码中填写输出内容。

7 依次为第二个和第三个节点重复4、5、6步,设置节点内容。

public sealed partial class Workflow1 : StateMachineWorkflowActivity    {        //构造方法        public Workflow1()        {            InitializeComponent();        }        //时间延迟控件1,输出当前时间        private void delayActivity1_InitializeTimeoutDuration(object sender, EventArgs e)        {            Console.WriteLine("Delay1 Time:" + System.DateTime.Now.ToString());        }        //输出控件1        private void codeActivity1_ExecuteCode(object sender, EventArgs e)        {            Console.WriteLine("Hollo World!");        }        //时间延迟控件2,输出当前时间        private void delayActivity2_InitializeTimeoutDuration(object sender, EventArgs e)        {            Console.WriteLine("Delay1 Time:" + System.DateTime.Now.ToString());        }        //输出控件2        private void codeActivity2_ExecuteCode(object sender, EventArgs e)        {            Console.WriteLine("Hi!");        }        //时间延迟控件3,输出当前时间        private void delayActivity3_InitializeTimeoutDuration(object sender, EventArgs e)        {            Console.WriteLine("Delay1 Time:" + System.DateTime.Now.ToString());        }        //输出控件3        private void codeActivity3_ExecuteCode(object sender, EventArgs e)        {            Console.WriteLine("How Are You!");        }    }


8 设置第一个节点为初始状态。


运行,输出结果如下:

说明:状态机的目的是构建业务流程中的离散点,通过节点中的事件来控制流程状态。状态机有一个起点和一个终点,中间状态通过预期事件的触发进行控制,但是机器只能处于一个特定状态。

本文的例子中,我们创建了三个状态(节点),其中第一个节点为初识状态(第8步实现),状态三为终止状态(流程控制);状态之间的流转通过事件eventDriven(第3步实现)控制,eventDriven等待writeline控件的执行,当writeline执行完成后,出发eventDriven事件,流程流转到下一setstate设置好的下一状态状态,程序就这样开始执行了,直到执行到第三个状态的最后一个事件,流程执行结束。

1 0