Persistence 持久化
WF4提供了一个抽象类System.Runtime.Persistence.InstanceStore,用于定义持久化的实现.该类来自于 System.Runtime.dll
可以从InstanceStore类继承来开发Persistence Provider,持久化过程中的对实例的数据访问需要另外一个继 承自System.Activities.Persistence.PersistenceParticipant
WF4提供了一个基于SQL Server的持久化类 SqlWorkflowInstanceStore
持久化的所有者
当只对实例进行持久化([实 例.PersistableIdle = PersistableIdleAction.Persist] 或instance.Persist(),或Persist Activity),而没将实例时UnLoad时,该持久 化的实例被其所有者锁定.如果对Load持久化的实例不是该实例的所有者,会报如下异常:
The execution of an InstancePersistenceCommand was interrupted because the instance 'c42a0d7d-d652-404a-9734- 67acb163ea48' is locked by a different instance owner. This error usually occurs because a different host has the instance loaded. The instance owner ID of the owner or host with a lock on the instance is 'c9959a30-60aa-47ae-a119- bc8ff1b97720'.
因为实例"c42a0d7d-d652-404a-9734-67acb163ea48"一个不同的实例的所有者被锁定,被打断了一个 InstancePersistenceCommand 的执 行。因为不同的主机有实例加载时,通常会发生此错误。实例的拥有人或主机实例上的锁的所有者 ID 是 ' c9959a30-60aa-47ae-a119- bc8ff1b97720。
关于Activity.CacheMetadata方法
注意:Activity.CacheMetadata方法会多次被调用
流程中的Activity.CacheMetadata 方法会在Run时全部调用,
每当从持久化中Load实例时,Activity.CacheMetadata方法会再次全部调用
与持久化相关的事件执 行顺序
实例.PersistableIdle
实例.Idle
实例.Unloaded
当实例完成后,执行完[实例.Completed]后才执行[ 实例.Unloaded]
SqlWorkflowInstanceStore 数据库
\Windows\Microsoft.NET\Framework\v4.0.21006 \SQL\en |
SqlWorkflowInstanceStoreSchema.sql SqlWorkflowInstanceStoreLogic.sql |