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(); } } }
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设置好的下一状态状态,程序就这样开始执行了,直到执行到第三个状态的最后一个事件,流程执行结束。