程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 工作流編程循序漸進(5:狀態機工作流)

工作流編程循序漸進(5:狀態機工作流)

編輯:關於C#

一、狀態機工作流簡介

狀態機工作流由一組狀態組成。一個狀態被指示為初始狀態。每個狀態都可以接收一組特定事件。視事件而定,可以轉換到另一個狀態。狀態機工作流可以有最終狀態。當轉換到最終狀態時,工作流將完成。

[一]狀態機設計器視圖

狀態機設計器是一種自由形式的設計器,這意味著可以在設計圖面上自由移動活動。

狀態機設計器有兩個視圖: (1)“狀態”視圖

(2)“事件驅動”視圖

狀態視圖顯示狀態活動和可包含在狀態活動內的事件驅動的活動。在此視圖中,從一個狀態到另一個狀態的轉換是由直線表示的,這些直線從一個狀態中的事件驅動活動延伸到另一個狀態。

也可以通過自己繪制直線來創建一個狀態活動到另一個狀態活動的轉換。若要繪制轉換,請你選擇事件驅動的活動,然後選擇活動上的某個手柄並拖動該手柄。此操作將繪制直線。此直線隨後將連接到目標狀態,指示狀態之間的轉換。如下圖所示:

拖動上圖狀態活動內部的事件驅動活動的手柄,拖動到下面的狀態活動上即可,得到如下圖所示的結果:

若要訪問事件驅動的視圖,請雙擊事件驅動的活動。出現的設計器與順序工作流設計器很像。在設計器的頂部,導航欄顯示直到所顯示事件驅動活動為止的活動層次結構。可以通過單擊顯示的層次結構中的任意元素導航回狀態視圖。如果已在狀態視圖中繪制了從一個狀態到另一個狀態的轉換,並且正在顯示該活動的事件驅動視圖,則會為您將一個已設置狀態活動添加到事件驅動的活動。如果更改已設置狀態活動的屬性,它將反映到狀態視圖中。

[二]狀態機工作流活動

下表描述了狀態機工作流設計器中使用的關鍵活動。

工具箱名稱 活動 說明 State StateActivity 表示狀態機中的一個狀態;可能包含其他 StateActivity 活動。有關更多信息,請參見 使用 StateActivity 活動(可能為英文網頁)。 SetState SetStateActivity 指定到新狀態的轉換。有關更多信息,請參見 使用 SetStateActivity 活動(可能為英文網頁)。 StateInitialization StateInitializationActivity 在進入某個狀態時執行;可能包含其他活動。有關更多信息,請參見 使用 StateInitialization 活動(可能為英文網頁)。 StateFinalization StateFinalizationActivity 在離開 StateActivity 活動時執行包含的活動。有關更多信息,請參見 使用 StateFinalizationActivity 活動(可能為英文網頁)。 EventDriven EventDrivenActivity 用於依賴於外部事件開始執行的狀態。EventDrivenActivity 活動必須具有實現 IEventActivity 接口作為第一個子活動的活動。有關更多信息,請參見 使用 EventDrivenActivity 活動(可能為英文網頁)。

狀態機工作流中的主要組成部分是 StateActivity 活動。在狀態機工作流中的不同位置捕獲了事件時,將會進入不同的狀態,以處理與這些事件關聯的任務。在工作流的生存期內,工作流可能會離開和進入若干不同的狀態。這些狀態通過使用 SetStateActivity 活動互相連接。

將新的 StateActivity 拖到工作流設計圖面上時,您可以添加 EventDrivenActivity、 StateInitializationActivity、 StateFinalizationActivity 或其他 StateActivity 活動作為子活動。

警告:

使用狀態機工作流設計器來創建工作流時,推薦使用“文檔大綱”視圖窗口來監視所設計工作流的結構。“文檔大綱”視圖窗口中狀態機工作流結構的視圖反映了工作流標記文件中活動的邏輯布局。工作流活動顯示在設計圖面上的物理布局可能不會反映工作流標記文件中活動的邏輯布局。

若要打開“文檔大綱”窗口,方法有二:(1)在“視圖”菜單上指向“其他窗口”,然後選擇“文檔大綱”;(2)也可以右單擊某個狀態活動,然後選擇“文檔大綱”。

例如下面的圖形,左邊顯示的是“文檔大綱”,右邊是相應的狀態工作流。

二、創建控制台狀態工作流示例程序框架

請遵循如下步驟創建一個實現簡單的請假流程的控制台狀態工作流示例程序:

1. 啟動VS2008,單擊菜單”文件“|”新建“|”項目“,創建一個名字為MyStateWF的控制台狀態工作流示例程序。

2.之後,系統自動打開工作流設計器界面,如圖所示。

三、設計狀態機工作流3. 從工具箱中依次拖動四個State活動到上面的工作流設計器中。

4. 依次拖動三個eventDriven活動到上圖中上面的三個State活動中(最下面的一個不必拖入)。

5.確定各個狀態的轉換關系。文章開始時提供了兩種方法,顯然使用拖動手柄法非常簡單,結果如下:

6.狀態1為審批准備階段。現在,我們來看看具體的准備工作。為此,雙擊上圖狀態1中的eventDrivenActivity1,進入到狀態1的活動圖中。

7. 注意到,這裡自動添加了SetState活動,這是前面手動拖動手柄的結果。根據開始時的描述,eventDriven活動中的第一個子活動必須為延遲活動。為此,我們作如下修改:

因為狀態2執行結果存在兩種情況,一種是得到批准;另一種是不批准。為此,創建如下的狀態2活動:

狀態3中的活動非常簡單,如下圖所示:

四、設計狀態機中各活動的參數及有關函數本實例中,絕大部分的代碼活動僅是通過控制台輸入簡單的提示文字。對於上面的左邊的 IfElseBranch活動,在對應的屬性對話框中指定Condition為“代碼條件”,輸入條件方法名為LeaveCondition,按下回車,創建如下代碼:

private void LeaveCondition(object sender, ConditionalEventArgs e)
{
 System.Threading.Thread.Sleep(5000);
 string result = Console.ReadLine();
 if (result == "0")
 {
  e.Result = false;
 }
 if (result == "1")
 {
  e.Result = true;
 }
}

下面是分散在幾個代碼活動中的活動對應的ExecuteCode屬性函數的內容:

private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("這是初始狀態,請假流程開始!\n");
 System.Threading.Thread.Sleep(5000);
 Console.WriteLine("開始提交請假申請\n");
}
private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
 System.Threading.Thread.Sleep(5000);
 Console.WriteLine("收到請假申請,請批示:!\n");
 Console.WriteLine("輸入0:不同意請假。\n");
 Console.WriteLine("輸入1:同意請假。\n");
}
private void codeActivity5_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("請假申請結束!\n");
}
private void codeActivity3_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("允許請假!");
}
private void codeActivity4_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("不允許請假!");
}

在本例中,我們使用了System.Threading.Thread.Sleep函數,你也可以使用上面流程中的延遲函數進行設置。

四、運行實例按F5運行控制台程序,一般順利的話,將得到如下圖所示運行時快照。

從圖中看出,當輸入0時,整個請假流程循環從頭操作。當輸入1時,請假得到允許,整個流程結束。

補充因為本例中各個狀態的名稱都是使用漢字表示的,所以,需要把整個狀態機工作流的InitialStateName屬性更改為“准備”。

出處: http://zhuxianzhong.blog.51cto.com/157061/203483

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved