WorkflowPersistenceService.SaveWorkflowInstanceState 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在衍生類別中實作時,將工作流程執行個體狀態儲存至資料存放區中。
protected public:
abstract void SaveWorkflowInstanceState(System::Workflow::ComponentModel::Activity ^ rootActivity, bool unlock);
protected internal abstract void SaveWorkflowInstanceState (System.Workflow.ComponentModel.Activity rootActivity, bool unlock);
abstract member SaveWorkflowInstanceState : System.Workflow.ComponentModel.Activity * bool -> unit
Protected Friend MustOverride Sub SaveWorkflowInstanceState (rootActivity As Activity, unlock As Boolean)
參數
- 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 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 Overrides Sub SaveWorkflowInstanceState(ByVal rootActivity As System.Workflow.ComponentModel.Activity, ByVal unlock As Boolean)
Dim contextGuid As Guid = CType(rootActivity.GetValue(Activity.ActivityContextGuidProperty), Guid)
Console.WriteLine("Saving instance: 0}" + vbLf, contextGuid)
SerializeToFile( _
WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid)
' See when the next timer (Delay activity) for this workflow will expire
Dim timers As TimerEventSubscriptionCollection = CType(rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty), TimerEventSubscriptionCollection)
Dim subscription As TimerEventSubscription = timers.Peek()
If subscription IsNot Nothing Then
' Set a system timer to automatically reload this workflow when it's next timer expires
Dim timeDifference As TimeSpan = subscription.ExpiresAt - DateTime.UtcNow
Dim callback As TimerCallback = New TimerCallback(AddressOf ReloadWorkflow)
Dim timer As New System.Threading.Timer( _
callback, _
subscription.WorkflowInstanceId, _
CType(IIf(timeDifference < TimeSpan.Zero, TimeSpan.Zero, timeDifference), TimeSpan), _
New TimeSpan(-1))
End If
End Sub
備註
您必須呼叫其中一個多載的 Save 方法將 rootActivity
序列化至 Stream 中。 然後您可以選擇在寫入至您的資料存放區之前進一步處理 Stream。 然而,當工作流程執行階段引擎呼叫 LoadWorkflowInstanceState 時,您必須還原根活動的相同複本。 如果您無法將工作流程執行個體狀態儲存至資料存放區中,則應該擲回有適當錯誤訊息的 PersistenceException。
工作流程執行階段引擎提供鎖定語意,以限制存取儲存在資料存放區中的工作流程執行個體狀態。 這可以由在多台主機中執行並指向相同資料存放區的持續性服務來存取。 鎖定語意的設計是為了避免兩個不同工作流程執行階段中執行的持續性服務,同時將相同的工作流程執行個體載入記憶體中。 視您的持續性服務在設計上所支援的環境類型而定,您可以選擇是否支援這項功能。 如果您選擇支援執行階段鎖定語意,然後,如果持續性服務嘗試儲存之前由其他持續性服務鎖定的工作流程執行個體狀態,則您應該擲回 WorkflowOwnershipException。 如果 unlock
是 true
,您應該在儲存之後解除鎖定對工作流程執行個體狀態的存取。
LoadWorkflowInstanceState 會接受工作流程執行個體的 Guid 做為參數。 因此,您應該儲存此 Guid。 您也可以使用此 Guid 將工作流程執行個體與其已完成範圍的儲存狀態產生關聯。 之所以必須這樣做是因為您必須能夠在工作流程執行個體完成時,將這些完成的範圍標示為不需要的範圍。
工作流程執行個體引擎在工作流程執行個體完成或終止時,對 SaveWorkflowInstanceState 做最後的呼叫。 因此,如果 GetWorkflowStatus 等於 Completed 或 Terminated,您就可以從資料存放區中,安全地刪除工作流程執行個體和所有與它關聯的完成範圍。 或者,您可以訂閱 WorkflowCompleted 或 WorkflowTerminated 事件,以判斷何時是刪除與工作流程執行個體關聯之記錄的安全時機。 是否實際從您的資料存放區刪除記錄要視您的實作而定。
如果您實作使用長期存放區的持續性服務,為了維持與工作流程執行階段引擎內部狀態的一致性,您應該參與工作流程交易批次處理,以延遲對您的長期存放區的實際寫入,直到工作流程認可點為止。 若要參與批次處理,請將代表暫停變更長期存放區的工作項目加入至 WorkBatch 屬性中,然後在您的持續性服務中實作 IPendingWork 介面。