WF 環境中執行任務需由 WorkflowRuntime 物件監管。它啟動獨立工作流任務,響應執行過程中的各類事件,並可添加額外服務(如追蹤)。

結合單例與工廠模式,確保應用程式域內唯一 WorkflowRuntime 實例,支援多模組加載。
public static class WorkflowFactory
{
private static WorkflowRuntime _workflowRuntime = null;
private static object _syncRoot = new object();
public static WorkflowRuntime GetWorkflowRuntime()
{
lock (_syncRoot)
{
if (null == _workflowRuntime)
{
AppDomain.CurrentDomain.ProcessExit += new EventHandler(StopWorkflowRuntime);
AppDomain.CurrentDomain.DomainUnload += new EventHandler(StopWorkflowRuntime);
_workflowRuntime = new WorkflowRuntime();
_workflowRuntime.StartRuntime();
}
}
return _workflowRuntime;
}
static void StopWorkflowRuntime(object sender, EventArgs e)
{
if (_workflowRuntime != null && _workflowRuntime.IsStarted)
{
try { _workflowRuntime.StopRuntime(); }
catch (ObjectDisposedException) { }
}
}
}
| 屬性 | 功能 |
|---|---|
| IsStarted | 指示運行時是否已啟動並就緒。StartRuntime 前為 False,StopRuntime 前保持 True。運行中不可添加核心服務 |
| Name | 獲取/設定關聯名稱。運行中不可設定 |
| 方法 | 功能 |
|---|---|
| AddService | 添加指定服務(類型與時間受限,第 5 章詳述) |
| CreateWorkflow | 創建工作流實例(含可選參數)。若運行時未啟動則自動調用 StartRuntime |
| GetWorkflow | 透過 Guid 識別碼檢索實例。閒置持久化實例將重新載入執行 |
| StartRuntime | 啟動運行時與相關服務,引發 Started 事件 |
| StopRuntime | 停止運行時與服務,引發 Stopped 事件 |
工廠方法中自動調用 StartRuntime。停止邏輯註冊於 AppDomain.ProcessExit 與 DomainUnload 事件,確保應用程式域關閉前正確釋放資源。
| 事件 | 觸發時機 |
|---|---|
| Started | 運行時啟動後 |
| Stopped | 運行時停止後 |
| WorkflowCompleted | 工作流實例完成後 |
| WorkflowIdled | 實例進入閒置狀態。可借機卸載、持久化至資料庫,稍後重載 |
| WorkflowTerminated | 實例被終止(宿主調用 Terminate、Terminate 活動、未捕獲異常) |
private static AutoResetEvent waitHandle = new AutoResetEvent(false);
static void Main(string[] args)
{
WorkflowRuntime workflowRuntime = WorkflowFactory.GetWorkflowRuntime();
workflowRuntime.WorkflowIdled += workflowRuntime_WorkflowIdled;
workflowRuntime.WorkflowCompleted += workflowRuntime_WorkflowCompleted;
workflowRuntime.WorkflowTerminated += workflowRuntime_WorkflowTerminated;
Console.WriteLine("等待 workflow 完成。");
waitHandle.WaitOne();
Console.WriteLine("完成.");
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
Console.WriteLine("workflow 實例閒置中");
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
Console.WriteLine("workflow 實例已完成");
waitHandle.Set();
}
static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine("workflow 實例已終止, 原因: '{0}'。", e.Exception.Message);
waitHandle.Set();
}

下一章將深入工作流實例。若當前直接執行此程式會無限等待,因尚未啟動任何工作流實例,事件永不觸發。