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設置好的下一狀態狀態,程序就這樣開始執行了,直到執行到第三個狀態的最後一個事件,流程執行結束。