WF會定期在各個持久性點(Persistence Point)檢查并将工作流執行個體儲存到持久化存儲中,這樣如果工作流出現錯誤或是異常終止時相關的資訊就會被存儲,下次加載工作流執行個體時就會從此做為開始點。這個主要是針對工作内置的服務。工作流的外部服務使用工作批次來保留狀态資訊。 這些服務對其工作項進行批處理并共享與工作流的事務相同的事務。 如果工作流尚未送出事務,則服務仍可以在持久點期間對某些工作項進行批處理。WF提供 IWorkBatch 和 IPendingWork 以幫助服務和工作流執行個體保留狀态資訊。
我們先來看一個簡單的例子
一:首先定義一個本地服務IBatchedServices.cs,其中定義了一個DoSomeWork的方法,用于給工作流添加一個挂起的工作項,代碼如下:
四:宿主程式如下:
<a href="http://11011.net/software/vspaste"></a>
當TransactionScopeActivity完成時,事務被送出。然後建立持久化點(persistence point。使用持久化服務類儲存工作流執行個體的資訊。
IPendingWork送出。下面是MSDN中的描述:
調用元件時的操作順序
1. 在初始化期間,工作流建立一個工作批次。
2. 工作流将工作批次附加到對元件的方法調用中。 通過使用 WorkflowEnvironment 類,服務可以通路其任何方法中的工作批次。
送出點處的操作順序
1. 工作流建立一個事務。
2. 工作流循環通路工作批次并收集元件的所有工作項(保持順序)以建立工作批次。 工作流傳入事務和工作批次,調用元件上的 Commit 方法。
3. 元件将工作批次中的工作添加到事務。
4. 對工作項在工作批次中的所有元件重複第 2 步和第 3 步。
5. 當 Commit 通知成功時,工作流送出對應的事務。
6. 成功送出事務後,工作流循環通路工作批次并收集每個元件的所有工作項(如第 2 步所述)。工作流傳入對應的事務和工作批次,調用每個元件的 Complete 方法。
對工作流錯誤的操作順序
1. 工作流辨別所有與出錯範圍相關的工作項并建構一個工作批次。
2. 工作流調用每個唯一的、将工作批次中所有工作的完成狀态設定為 false 的 IPendingWork 的 Complete 方法。
3. 如果工作批次屬于 TransactionScopeActivity 活動或 CompensatingTransactionScopeActivity 活動的子上下文,則工作流放棄工作批次中的所有工作。
4. 從錯誤恢複後,運作時保持對所有剩餘工作批次項的引用。 随後,可能會在将來的持久點送出該工作。
本文轉自生魚片部落格園部落格,原文連結:http://www.cnblogs.com/carysun/archive/2008/09/02/IPendingWork.html,如需轉載請自行聯系原作者