您的位置:首页 > 其它

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

2016-01-26 10:22 344 查看
上篇文章简要介绍了工作流的基本知识,这片文章我们开始工作流之旅,第一个工作流程序--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设置好的下一状态状态,程序就这样开始执行了,直到执行到第三个状态的最后一个事件,流程执行结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: