天天看點

堅持學習WF(18):使用IPendingWork接口

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,如需轉載請自行聯系原作者