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

WF 從入門到精通(第三章):工作流實例全生命週期管理

     編輯:關於.NET

學習目標

  • 掌握無參數與帶參數兩種方式初始化工作流實例
  • 監測運行中工作流實例的狀態
  • 正確停止工作流實例
  • 判斷工作流閒置或終止的原因

工作流實例核心概念

工作流實例由一或多個活動組成。「主要活動」或「根活動」稱為「工作流定義」,其行為是為其他活動提供容器。關鍵區別:工作流定義是靜態的「要執行什麼」,工作流實例是動態的「正在執行的定義」。

實例由開發者創建,WF 運行時負責執行。VS 提供豐富的圖形化設計器,支援拖放活動、屬性配置,可整合至 ASP.NET、WinForms、WPF 應用中。

實例生命週期

工作流實例類似一般軟體:啟動 → 運行 → 遇終止條件停止(資料處理完、文件壓縮完、審批完成等)。單一啟動點,但可能有多個正常終止點。實例也可能遇錯誤/異常,可選擇即時處理或延後處理。

長時間運行挑戰

某些流程需天、週甚至月才能完成(如等待訂單確認)。難道實例要在記憶體常駐那麼久?伺服器崩潰或斷電怎麼辦?WF 提供持久化機制解決此問題(第 6 章詳細討論)。

WorkflowInstance 物件詳解

WorkflowInstance 提供獨立工作流任務的上下文環境,可控制任務執行流程。

表 3-1:WorkflowInstance 屬性

屬性功能
InstanceId獲取工作流實例唯一識別碼
WorkflowRuntime獲取該實例所屬的 WorkflowRuntime

表 3-2:WorkflowInstance 常用方法

方法功能
ApplyWorkflowChanges透過 WorkflowChanges 物件動態修改實例(增/刪/改活動),執行時暫停實例
GetWorkflowDefinition檢索實例的根活動
Resume恢復先前暫停的實例,觸發 WorkflowResumed 事件
Start啟動實例執行(調用根活動 ExecuteActivity),異常時自動終止並記錄原因
Suspend同步暫停實例,設置暫停原因,觸發 WorkflowSuspended 事件
Terminate同步終止實例,嘗試持久化最終狀態,觸發 WorkflowTerminated 事件

更多方法見第 6 章「實例的載入與卸載」。

實戰:啟動工作流實例

建立模擬長時間任務的順序工作流

在 WorkflowHost 方案中新增「順序工作流程式庫」專案 LongRunningWorkflow,設計器中添加兩個 Code 活動夾著一個 Delay 活動,分別在延遲前後彈出訊息對話框。

拖放 Code 活動

設定 ExecuteCode 事件

添加 Delay 活動

最終工作流設計

添加事件處理程式碼

using System.Windows.Forms;
// PreDelayMessage 方法
MessageBox.Show("正在執行延時前的代碼。");
// PostDelayMessage 方法  
MessageBox.Show("正在執行延時後的代碼。")

宿主自訂工作流組件並啟動無參數實例

  1. WorkflowHost 專案添加 LongRunningWorkflow 參考
  2. 添加 System.Workflow.Activities、System.Workflow.ComponentModel 參考
  3. Program.cs 中啟動實例:
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(LongRunningWorkflow.Workflow1));
instance.Start();

執行結果

啟動帶參數的工作流實例

透過 Dictionary<string, object> 傳遞參數,鍵對應根活動的公有屬性名,值類型需匹配。修改 Workflow1.cs 添加 Delay 公有屬性(含範圍驗證與執行狀態檢查),修改 Main 方法從命令列讀取參數。

// Workflow1.cs 新增屬性
private Int32 _delay = 10;
public Int32 Delay {
    get { return _delay; }
    set {
        if (value < 0 || value > 120) value = 10;
        if (ExecutionStatus == ActivityExecutionStatus.Initialized) {
            _delay = value;
            delayActivity1.TimeoutDuration = new TimeSpan(0, 0, _delay);
        }
    }
}

// Program.cs 修改
Dictionary<string, object> parms = new Dictionary<string, object>();
parms.Add("Delay", delay);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(LongRunningWorkflow.Workflow1), parms);

確定工作流實例狀態

WorkflowRuntime 與 WorkflowInstance 均無直接狀態屬性。透過工作流定義(根活動)的 ExecutionStatus 屬性(ActivityExecutionStatus 列舉)獲取實例狀態。

表 3-3:ActivityExecutionStatus 列舉值

值含義
Canceling正在取消
Closed已關閉
Compensating補償狀態
Executing正在運行
Faulting產生並持有異常
Initialized已初始化未運行

查詢範例:instance.GetWorkflowDefinition().ExecutionStatus.ToString()

終止工作流實例

調用 instance.Terminate("用戶取消") 即可。WorkflowTerminated 事件處理器可從 Exception.Message 獲取終止原因。

終止執行結果

脫水與補水

長時間運行或大量任務時,可將實例從執行狀態移除並存儲至 SQL Server(透過持久化服務),此為「脫水」;稍後恢復執行狀態為「補水」。第 6 章詳細討論。

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