有限狀態機 (FSM) 由離散狀態組成,透過事件觸發在狀態間轉換。具備明確的初始狀態與終止狀態,任一時刻處於單一狀態。適用於需大量外部事件互動的流程 (如訂單審核、自動販賣機)。
| 活動 | 用途 |
|---|---|
StateActivity | 組合活動,代表一個狀態。子活動限於 EventDrivenActivity、StateInitializationActivity、StateFinalizationActivity、巢狀 StateActivity。 |
EventDrivenActivity | 等待特定事件,觸發後執行內含活動並可轉換狀態。 |
StateInitializationActivity | 進入狀態時保證執行一次 (每狀態僅一個)。 |
StateFinalizationActivity | 離開狀態時保證執行一次 (每狀態僅一個)。 |
SetStateActivity | 執行狀態轉換,指定 TargetStateName。 |
模擬投幣、選購、出貨流程。每瓶 $1.25,提供 5¢、10¢、25¢ 投幣按鈕。工作流追蹤金額,達標後啟用飲料按鈕;選購後顯示「Soda!」,重置可重新開始。





SodaMachine 方案,編譯產生自訂活動組件。SodaFlow\Workflow1.cs,設計工具預設含一個 StateActivity。InitialStateName = StartState。CompletedStateName = EndState (圖示變化)。

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

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


EventDrivenActivity 命名 ItemSelected。ItemSelected 自訂活動。SetStateActivity → EndState。

private void ResetTotal(object sender, EventArgs e) { Total = 0.0m; }
private void TestTotal(object sender, ConditionalEventArgs e)
{
Total += LastCoinDropped;
e.Result = Total >= 1.25m;
}
注意: 若發生
InvalidOperationException,通常為參考未更新,重新編譯方案即可。
狀態機工作流透過 StateActivity、EventDrivenActivity、SetStateActivity 實現事件驅動的狀態轉換。StateInitialization/Finalization 確保進入/離開狀態的必要邏輯執行。本章範例展示如何將實體自動販賣機流程對應為 WF 狀態機,結合自訂本機通訊活動與宿主 UI 互動,呈現 WF 在事件導向業務流程的優雅建模能力。