工作流實例由一或多個活動組成。「主要活動」或「根活動」稱為「工作流定義」,其行為是為其他活動提供容器。關鍵區別:工作流定義是靜態的「要執行什麼」,工作流實例是動態的「正在執行的定義」。
實例由開發者創建,WF 運行時負責執行。VS 提供豐富的圖形化設計器,支援拖放活動、屬性配置,可整合至 ASP.NET、WinForms、WPF 應用中。
工作流實例類似一般軟體:啟動 → 運行 → 遇終止條件停止(資料處理完、文件壓縮完、審批完成等)。單一啟動點,但可能有多個正常終止點。實例也可能遇錯誤/異常,可選擇即時處理或延後處理。
某些流程需天、週甚至月才能完成(如等待訂單確認)。難道實例要在記憶體常駐那麼久?伺服器崩潰或斷電怎麼辦?WF 提供持久化機制解決此問題(第 6 章詳細討論)。
WorkflowInstance 提供獨立工作流任務的上下文環境,可控制任務執行流程。
| 屬性 | 功能 |
|---|---|
| InstanceId | 獲取工作流實例唯一識別碼 |
| WorkflowRuntime | 獲取該實例所屬的 WorkflowRuntime |
| 方法 | 功能 |
|---|---|
| ApplyWorkflowChanges | 透過 WorkflowChanges 物件動態修改實例(增/刪/改活動),執行時暫停實例 |
| GetWorkflowDefinition | 檢索實例的根活動 |
| Resume | 恢復先前暫停的實例,觸發 WorkflowResumed 事件 |
| Start | 啟動實例執行(調用根活動 ExecuteActivity),異常時自動終止並記錄原因 |
| Suspend | 同步暫停實例,設置暫停原因,觸發 WorkflowSuspended 事件 |
| Terminate | 同步終止實例,嘗試持久化最終狀態,觸發 WorkflowTerminated 事件 |
更多方法見第 6 章「實例的載入與卸載」。
在 WorkflowHost 方案中新增「順序工作流程式庫」專案 LongRunningWorkflow,設計器中添加兩個 Code 活動夾著一個 Delay 活動,分別在延遲前後彈出訊息對話框。




using System.Windows.Forms;
// PreDelayMessage 方法
MessageBox.Show("正在執行延時前的代碼。");
// PostDelayMessage 方法
MessageBox.Show("正在執行延時後的代碼。")
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 列舉)獲取實例狀態。
| 值 | 含義 |
|---|---|
| Canceling | 正在取消 |
| Closed | 已關閉 |
| Compensating | 補償狀態 |
| Executing | 正在運行 |
| Faulting | 產生並持有異常 |
| Initialized | 已初始化未運行 |
查詢範例:instance.GetWorkflowDefinition().ExecutionStatus.ToString()
調用 instance.Terminate("用戶取消") 即可。WorkflowTerminated 事件處理器可從 Exception.Message 獲取終止原因。

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