这是一个旧线程,但我偶然发现了同样的问题。
Damir's Corner建议在调用实例存储之前检查实例句柄是否仍然有效。我在此引用整篇文章:
Workflow Foundation 的某些方面仍然缺乏文档记录;持久性框架就是其中之一。以下代码段通常用于设置实例存储:
var instanceStore = new SqlWorkflowInstanceStore(connectionString);
instanceStore.HostLockRenewalPeriod = TimeSpan.FromSeconds(30);
var instanceHandle = instanceStore.CreateInstanceHandle();
var view = instanceStore.Execute(instanceHandle,
new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(10));
instanceStore.DefaultInstanceOwner = view.InstanceOwner;
很难找到所有这一切的详细解释。老实说,通常没有必要。至少不会,直到您开始遇到问题,例如 InstanceOwnerException:
InstancePersistenceCommand 的执行被中断,因为所有者 ID '9938cd6d-a9cb-49ad-a492-7c087dcc93af' 的实例所有者注册已失效。此错误表明此所有者锁定的所有实例的内存副本已过时,应连同 InstanceHandles 一起丢弃。通常,最好通过重新启动主机来处理此错误。
该错误与 HostLockRenewalPeriod 属性密切相关,该属性定义了获得的实例句柄在不被更新的情况下有效的时间。如果您在实例化具有有效实例句柄的实例存储时尝试监控数据库,您会注意到 [System.Activities.DurableInstancing].[ExtendLock] 被定期调用。这个存储过程负责更新句柄。如果由于某种原因未能在指定的 HostLockRenewalPeriod 内调用,则在尝试持久化工作流时将引发上述异常。一个典型的原因是由于维护或网络问题而暂时无法访问数据库。这不是经常发生的事情,但如果你有一个长期存在的实例存储,它就一定会发生,例如
幸运的是,一旦您知道了问题的原因,解决问题并不是那么困难。在使用实例存储之前,您应该始终检查句柄是否仍然有效;并更新它,如果不是:
if (!instanceHandle.IsValid)
{
instanceHandle = instanceStore.CreateInstanceHandle();
var view = instanceStore.Execute(instanceHandle,
new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(10));
instanceStore.DefaultInstanceOwner = view.InstanceOwner;
}
错误消息表明,它绝对比重新启动主机的侵入性更小。