探索工作流(二)--狀態工作流 My Workflow Trip

上篇文章簡要介紹了工作流的基本知識,這片文章我們開始工作流之旅,第一個工作流程序--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設置好的下一狀態狀態,程序就這樣開始執行了,直到執行到第三個狀態的最後一個事件,流程執行結束。

發佈了124 篇原創文章 · 獲贊 168 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章