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

WF 核心教學第六章:工作流實例載入、卸載與 SQL 持久化全攻略

     編輯:關於.NET

第六章核心主題:長時間運行工作流的資源管理——實例卸載/載入與 SQL 持久化。涵蓋卸載時機、手動/自動持久化、SqlWorkflowPersistenceService 設定、資料庫腳本部署、Windows Forms 測試應用與主控台自動持久化範例。

為什麼需要持久化?

長時間工作流(等待人工審核、外部系統回應)若常駐記憶體,會耗盡伺服器資源。WF 提供機制將空閒實例序列化至 SQL Server,釋放資源;稍後自動或手動重新載入繼續執行。亦可防止系統異常關機導致實例遺失。

工作流實例卸載/持久化觸發點

  1. ActivityExecutionContext 完成結束時。
  2. 活動進入空閒狀態(如 Delay、等待外部事件)。
  3. TransactionScopeActivity 完成時(第 15 章)。
  4. 活動標記 [PersistOnCloseAttribute] 完成時。
  5. 程式碼呼叫 WorkflowInstance.Unload() 或 TryUnload()。

SqlWorkflowPersistenceService 服務介紹

可插拔服務,協同 WorkflowInstance 執行儲存/還原。支援多進程/多機器共享單一資料庫,儲存實例狀態(阻塞、執行中、空閒)、序列化資料、擁有者識別等。

WorkflowInstance 三大持久化方法:

方法行為
Load載入先前卸載的實例
TryUnload嘗試非阻塞式卸載,立即回傳 bool 表示是否成功
Unload同步阻塞式卸載,直到持久化完成

建立 SQL Server 持久化資料庫

  1. SSMS 建立資料庫 WorkflowStore。
  2. 執行 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\ZH-CHS\SqlPersistence.Schema.sql 建立資料表/檢視。
  3. 執行 SqlPersistence.Logic.sql 建立預存程序。

SSMS 連線

範例一:Windows Forms 手動卸載/載入測試

UI 三按鈕:Start/Unload/Load。工作流包含兩個 Code 活動,第一個 Thread.Sleep(10秒) 模擬長時間處理,期間點擊 Unload 觸發持久化,Load 重新載入續跑。

  1. 建立 WorkflowPersister WinForms 專案,加入 app.config 連線字串。
  2. WorkflowFactory 註冊 SqlWorkflowPersistenceService(連線字串)。
  3. 表單 Load 事件初始化 Runtime 並訂閱 Completed/Terminated 事件。
  4. Start 按鈕建立並啟動實例;Unload 按鈕呼叫 _instance.Unload();Load 按鈕呼叫 _instance.Load()。
  5. 使用 InvokeRequired/BeginInvoke 確保跨執行緒 UI 更新安全。
  6. 工作流專案 PersistedWorkflow:兩 Code 活動記錄開始/結束時間與耗時。

WinForms 設計器 按鈕佈局 三按鈕介面 Form Load 事件 工作流設計器 InstanceState 表持久化記錄 輸出視窗耗時比較

測試結果:未卸載實例耗時 ~10 秒;卸載後重載實例耗時 ~1 分 41 秒(含資料庫輪詢),InstanceState 表記錄相同 InstanceID,驗證持久化成功。

範例二:主控台應用自動持久化

利用 Delay 活動觸發自動持久化。關鍵在於 SqlWorkflowPersistenceService 建構子傳入 NameValueCollection 設定 UnloadOnIdle=true。

NameValueCollection parms = new NameValueCollection();
parms.Add("UnloadOnIdle", "true");
parms.Add("ConnectionString", connStr);
_workflowRuntime.AddService(new SqlWorkflowPersistenceService(parms));

工作流:Code → Delay(30秒) → Code。執行時,Delay 期間實例自動持久化至資料庫,30 秒後(最多 2 分鐘輪詢間隔)自動載入繼續。

加入 Delay 活動

進階設定:四參數建構子可調整鎖定逾時、資料庫輪詢頻率(預設 2 分鐘),平衡響應速度與資料庫負載。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved