WorkflowPersistenceService.SaveWorkflowInstanceState 方法

定義

在衍生類別中實作時,將工作流程執行個體狀態儲存至資料存放區中。

protected internal abstract void SaveWorkflowInstanceState (System.Workflow.ComponentModel.Activity rootActivity, bool unlock);

參數

rootActivity
Activity

工作流程執行個體的根活動。

unlock
Boolean

如果不應鎖定工作流程執行個體則為 true,如果應鎖定工作流程執行個體則為 false

範例

下列範例示範 SaveWorkflowInstanceState 方法的實作。 這個範例來自 FilePersistenceService.cs 檔案中的<自訂持續性服務>範例。 如需詳細資訊,請參閱 自訂持續性服務範例

// Save the workflow instance state at the point of persistence with option of locking the instance state if it is shared
// across multiple runtimes or multiple phase instance updates
protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
{
    // Save the workflow
    Guid contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);
    Console.WriteLine("Saving instance: {0}\n", contextGuid);
    SerializeToFile(
        WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid);

    // See when the next timer (Delay activity) for this workflow will expire
    TimerEventSubscriptionCollection timers = (TimerEventSubscriptionCollection)rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty);
    TimerEventSubscription subscription = timers.Peek();
    if (subscription != null)
    {
        // Set a system timer to automatically reload this workflow when its next timer expires
        TimerCallback callback = new TimerCallback(ReloadWorkflow);
        TimeSpan timeDifference = subscription.ExpiresAt - DateTime.UtcNow;
        System.Threading.Timer timer = new System.Threading.Timer(
            callback,
            subscription.WorkflowInstanceId,
            timeDifference < TimeSpan.Zero ? TimeSpan.Zero : timeDifference,
            new TimeSpan(-1));
    }
}

備註

您必須呼叫其中一個多載的 Save 方法將 rootActivity 序列化至 Stream 中。 然後您可以選擇在寫入至您的資料存放區之前進一步處理 Stream。 然而,當工作流程執行階段引擎呼叫 LoadWorkflowInstanceState 時,您必須還原根活動的相同複本。 如果您無法將工作流程執行個體狀態儲存至資料存放區中,則應該擲回有適當錯誤訊息的 PersistenceException

工作流程執行階段引擎提供鎖定語意,以限制存取儲存在資料存放區中的工作流程執行個體狀態。 這可以由在多台主機中執行並指向相同資料存放區的持續性服務來存取。 鎖定語意的設計是為了避免兩個不同工作流程執行階段中執行的持續性服務,同時將相同的工作流程執行個體載入記憶體中。 視您的持續性服務在設計上所支援的環境類型而定,您可以選擇是否支援這項功能。 如果您選擇支援執行階段鎖定語意,然後,如果持續性服務嘗試儲存之前由其他持續性服務鎖定的工作流程執行個體狀態,則您應該擲回 WorkflowOwnershipException。 如果 unlocktrue,您應該在儲存之後解除鎖定對工作流程執行個體狀態的存取。

LoadWorkflowInstanceState 會接受工作流程執行個體的 Guid 做為參數。 因此,您應該儲存此 Guid。 您也可以使用此 Guid 將工作流程執行個體與其已完成範圍的儲存狀態產生關聯。 之所以必須這樣做是因為您必須能夠在工作流程執行個體完成時,將這些完成的範圍標示為不需要的範圍。

工作流程執行個體引擎在工作流程執行個體完成或終止時,對 SaveWorkflowInstanceState 做最後的呼叫。 因此,如果 GetWorkflowStatus 等於 CompletedTerminated,您就可以從資料存放區中,安全地刪除工作流程執行個體和所有與它關聯的完成範圍。 或者,您可以訂閱 WorkflowCompletedWorkflowTerminated 事件,以判斷何時是刪除與工作流程執行個體關聯之記錄的安全時機。 是否實際從您的資料存放區刪除記錄要視您的實作而定。

如果您實作使用長期存放區的持續性服務,為了維持與工作流程執行階段引擎內部狀態的一致性,您應該參與工作流程交易批次處理,以延遲對您的長期存放區的實際寫入,直到工作流程認可點為止。 若要參與批次處理,請將代表暫停變更長期存放區的工作項目加入至 WorkBatch 屬性中,然後在您的持續性服務中實作 IPendingWork 介面。

適用於

產品 版本
.NET Framework 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1