InstanceOwnerException после того, как Windows возвращается из спящего режима - PullRequest
2 голосов
/ 06 декабря 2011

Возможно, любой из вас может помочь мне с этой проблемой раздражения.У меня давно запущен рабочий процесс, который используется долго работающим приложением.
Я использую SqlWorkflowInstanceStore для сохранения.
Я установил DefaultInstanceOwner, чтобы можно было перезагрузить рабочие процессы при следующем запуске приложения.

InstanceHandle handle = workflowInstanceStore.CreateInstanceHandle();
InstanceView view = workflowInstanceStore.Execute(handle, 
                          new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
handle.Free();
workflowInstanceStore.DefaultInstanceOwner = view.InstanceOwner;

и удалить его при выходе из приложения:

 var deleteOwnerCmd = new DeleteWorkflowOwnerCommand();
 InstanceHandle handle = workflowInstanceStore.CreateInstanceHandle();
 workflowInstanceStore.Execute(handle, deleteOwnerCmd, TimeSpan.FromSeconds(30));
 handle.Free();

Всехорошо работает при обычном использовании приложения.Проблема возникает, если Windows переходит в спящий режим.Когда он возвращается из спящего режима, любая другая операция с workflowInstanceStore выдает:

System.Runtime.DurableInstancing.InstanceOwnerException: The execution of an InstancePersistenceCommand was interrupted because the instance owner registration for owner ID 'GUID' has become invalid. This error indicates that the in-memory copy of all instances locked by this owner have become stale and should be discarded, along with the InstanceHandles. Typically, this error is best handled by restarting the host.

Я просмотрел базу данных в LockOwnersTable, и срок действия блокировки установлен на 2000-01-0100: 00: 00.000 при пробуждении системы.

Любые идеи, чтобы найти причину этого поведения или обходные пути, приветствуются.Я уже взял первый обходной путь, то есть отключен спящий режим ...

1 Ответ

1 голос
/ 14 июня 2012

Я думаю, что причиной такого поведения является то, что хранилище экземпляров рабочего процесса должно сообщать базе данных, что оно все еще живо через регулярный промежуток времени (определяется свойством HostLockRenewalPeriod).Когда компьютер находится в спящем режиме, он не может обновить столбец LockExpiration в LockOwnersTable, и хранилище экземпляров рабочего процесса считается несуществующим.

Решение состоит в том, чтобы перезапустить хранилище экземпляров, когда компьютер выходит из режима ожидания.Вы можете обнаружить это, зарегистрировав событие Microsoft.Win32.SystemEvents.PowerModeChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...