首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows Workflow Foundation 進階教學:第十四章 - 狀態機工作流

     編輯:關於.NET

本章學習目標

  • 理解狀態機概念及其在工作流中的模型化
  • 建立狀態機工作流
  • 運用初始狀態與終止狀態條件
  • 使用程式碼進行狀態轉換

狀態機基本概念

有限狀態機 (FSM) 由離散狀態組成,透過事件觸發在狀態間轉換。具備明確的初始狀態與終止狀態,任一時刻處於單一狀態。適用於需大量外部事件互動的流程 (如訂單審核、自動販賣機)。

WF 狀態機活動

活動用途
StateActivity組合活動,代表一個狀態。子活動限於 EventDrivenActivity、StateInitializationActivity、StateFinalizationActivity、巢狀 StateActivity。
EventDrivenActivity等待特定事件,觸發後執行內含活動並可轉換狀態。
StateInitializationActivity進入狀態時保證執行一次 (每狀態僅一個)。
StateFinalizationActivity離開狀態時保證執行一次 (每狀態僅一個)。
SetStateActivity執行狀態轉換,指定 TargetStateName。

範例:汽水自動販賣機

模擬投幣、選購、出貨流程。每瓶 $1.25,提供 5¢、10¢、25¢ 投幣按鈕。工作流追蹤金額,達標後啟用飲料按鈕;選購後顯示「Soda!」,重置可重新開始。

圖 14-1 飲料機狀態圖

圖 14-2 初始介面

圖 14-3 投幣後介面

圖 14-4 可選購介面

圖 14-5 選購後介面

建立狀態機工作流步驟

  1. 開啟 SodaMachine 方案,編譯產生自訂活動組件。
  2. 編輯 SodaFlow\Workflow1.cs,設計工具預設含一個 StateActivity。

1. 定義四個狀態

  • 重命名預設狀態為 StartState,在工作流屬性設 InitialStateName = StartState。
  • 新增 WaitCoinsState、WaitSelectionState、EndState。
  • 設工作流 CompletedStateName = EndState (圖示變化)。

設定 InitialStateName

設定 CompletedStateName

2. StartState:初始化並轉至 WaitCoinsState

  • 加入 StateInitializationActivity → CodeActivity (ExecuteCode = ResetTotal)。
  • 加入 SetStateActivity (TargetStateName = WaitCoinsState)。

StartState 結構

SetState 設定

3. WaitCoinsState:處理投幣事件

  • 加入 EventDrivenActivity 命名 CoinInserted。
  • 內含 CoinInserted 自訂活動 (處理外部事件),繫結 CoinValue → 新相依屬性 LastCoinDropped。
  • 加入 IfElseActivity:條件 TestTotal (程式碼條件)。
    • True 分支:SetStateActivity → WaitSelectionState。
    • False 分支:UpdateTotal 自訂活動,繫結 Total → 新屬性 Total。
  • 加入 StateFinalizationActivity → ReadyToDispense 自訂活動,繫結 FinalTotal → 既有 Total。

CoinInserted EventDriven

IfElse 結構

StateFinalization

4. WaitSelectionState:處理選購事件

  • 加入 EventDrivenActivity 命名 ItemSelected。
  • 內含 ItemSelected 自訂活動。
  • 加入 SetStateActivity → EndState。

ItemSelected EventDriven

完成狀態圖

5. 程式碼後置


private void ResetTotal(object sender, EventArgs e) { Total = 0.0m; }

private void TestTotal(object sender, ConditionalEventArgs e)
{
    Total += LastCoinDropped;
    e.Result = Total >= 1.25m;
}

執行與驗證

  1. 編譯整個方案。
  2. 執行 (F5),點擊投幣按鈕觀察 LCD 總額更新;投入足額後飲料按鈕啟用;點選飲料顯示「Soda!」;點擊 Reset 重置介面。

注意: 若發生 InvalidOperationException,通常為參考未更新,重新編譯方案即可。

本章小結

狀態機工作流透過 StateActivity、EventDrivenActivity、SetStateActivity 實現事件驅動的狀態轉換。StateInitialization/Finalization 確保進入/離開狀態的必要邏輯執行。本章範例展示如何將實體自動販賣機流程對應為 WF 狀態機,結合自訂本機通訊活動與宿主 UI 互動,呈現 WF 在事件導向業務流程的優雅建模能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved