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 接口。