WF 讓開發者以聲明式活動圖建模複雜業務流程,結合命令式程式碼與規則引擎,特別適合包含人工介入的長時間流程。本文以技術支援票務系統為例,示範完整實作。
客戶來電 → 建立票證 → 客服人員離線 → 技術人員稍後認領處理 → 解決或升級 → 關閉票證。流程包含長時間等待與多角色互動,傳統順序程式碼難以管理狀態與持久化。
定義 IHelpDeskService 介面(標記 [DataExchangeService]),包含票證建立/關閉/升級方法與事件。HelpDeskService 實作介面,負責資料庫操作並向工作流引發外部事件。
[DataExchangeService]
public interface IHelpDeskService
{
event EventHandler<HelpDeskTicketEventArgs> TicketClosed;
event EventHandler<HelpDeskTicketEventArgs> TicketEscalated;
void CreateTicket(string description, string userRef, string createdBy);
void CloseTicket(string ticketID);
void EscalateTicket(string ticketID);
}
循序工作流 HelpDeskWorkflow:
InvokeMethod 呼叫服務建立票證Listen 活動等待外部事件,包含兩個 EventDriven 分支:EventSink 綁定 TicketClosed 事件EventSink 綁定 TicketEscalated 事件
工作流在 Listen 進入等待時自動持久化至 SQL Server(SqlWorkflowPersistenceService),從記憶體卸載(鈍化)。宿主程式啟動執行時引擎並註冊持久化服務:
WorkflowRuntime runtime = new WorkflowRuntime();
runtime.AddService(new HelpDeskService());
runtime.AddService(new SqlWorkflowPersistenceService(connString));
runtime.StartRuntime();
Windows Forms 前端建立票證時啟動工作流實例,票證 ID 即工作流 InstanceId。技術人員前端列出待處理票證,選取後呼叫 GetLoadedWorkflow(id) 從資料庫載入實例並引發對應事件:
WorkflowInstance inst = runtime.GetLoadedWorkflow(id);
helpDeskService.RaiseCloseTicketEvent(inst.InstanceId);
ThreadPool.QueueUserWorkItem)避免死結WorkflowCompleted 事件在非 UI 執行緒,更新介面需 Control.Invoke 封送Close 事件並設 Visibility.Hidden,再次顯示需重新呼叫 ShowDialogWF 提供托管執行環境、持久化、追蹤、補償等企業級特性,讓複雜長時間流程的建模與維護變得簡單可靠。適用於文件審核、訂單處理、B2B/B2C 等場景。