Участники сохраняемости

Участник сохранения может участвовать в операции сохранения (сохранить или загрузить), инициируемой хостом приложения. Платформа .NET Framework 4.6.1 поставляется с двумя абстрактными классами, PersistenceParticipant и PersistenceIOParticipant, которые можно использовать для создания участника сохраняемости. Участник сохранения данных наследуется от одного из этих классов, реализует необходимые методы, а затем добавляет экземпляр класса в коллекцию WorkflowExtensions на WorkflowServiceHost. Хост приложения может искать такие расширения для рабочего процесса при сохранении экземпляра рабочего процесса и вызывать подходящие методы для участников обеспечения сохранения в соответствующее время.

В следующем списке описаны задачи, выполняемые подсистемой сохранения на разных этапах операции "Сохранение". Участники процесса сохранения используются на третьем и четвертом этапах. Если участник является участником ввода-вывода (участником сохраняемости данных, который также участвует в операциях ввода-вывода), участник также используется на шестом этапе.

  1. Собирает встроенные значения, включая состояние рабочего процесса, закладки, сопоставленные переменные и метку времени.

  2. Собирает всех участников сохраняемости, добавленных в коллекцию расширений, связанную с экземпляром рабочего процесса.

  3. Вызывает метод CollectValues, реализованный всеми участниками постоянства.

  4. Вызывает метод MapValues, реализованный всеми участниками постоянства.

  5. Сохраните или сохраните рабочий процесс в хранилище сохраняемости.

  6. BeginOnSave Вызывает метод для всех участников операций ввода-вывода сохраняемости. Если участник не является участником ввода-вывода, эта задача пропускается. Если эпизод сохраняемости является транзакцией, транзакция предоставляется в свойстве Transaction.Current.

  7. Ожидает завершения всех процессов сохранения данных. Если все участники успешно сохраняют данные экземпляра, зафиксирует транзакцию.

Участник сохраняемости является производным от класса PersistenceParticipant и может реализовать методы CollectValues и MapValues. Участник сохраняемости ввода-вывода является производным от класса PersistenceIOParticipant и может реализовать метод BeginOnSave в дополнение к реализации методов CollectValues и MapValues .

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

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

  1. Собирает всех участников сохраняемости, добавленных в коллекцию расширений, связанную с экземпляром рабочего процесса.

  2. Загружает рабочий процесс из хранилища сохраняемости.

  3. Вызывает BeginOnLoad для всех участников операций ввода-вывода с сохранением данных и ожидает завершения операций всех участников сохранения. Если эпизод сохранения является транзакционным, транзакция доступна в Transaction.Current.

  4. Загружает экземпляр рабочего процесса в памяти на основе данных, полученных из хранилища сохраняемости.

  5. Функция PublishValues вызывается для каждого участника системы сохранения.

Участник сохраняемости является производным от класса PersistenceParticipant и может реализовать метод PublishValues . Участник сохраняемости ввода-вывода является производным от класса PersistenceIOParticipant и может реализовать метод BeginOnLoad в дополнение к реализации метода PublishValues .

При загрузке экземпляра рабочего процесса поставщик сохраняемости создает блокировку для этого экземпляра. Это предотвращает загрузку экземпляра более чем одним узлом в многосетевом сценарии. При попытке загрузить заблокированный экземпляр рабочего процесса, вы увидите сообщение об исключении, подобное следующему: "System.ServiceModel.Persistence.InstanceLockException: запрошенную операцию не удалось завершить, так как не удалось захватить блокировку для экземпляра '00000000-0000-0000-0000-000000000000'". Эта ошибка возникает при возникновении одной из следующих причин:

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

  • В сценарии с одним узлом хост вышел из строя. При повторном запуске узла (перезапуск процесса или создание фабрики поставщика сохраняемости) новый узел пытается загрузить экземпляр, который по-прежнему заблокирован старым узлом, так как блокировка еще не истекла.

  • В сценарии с одним узлом, если экземпляр, о котором идет речь, был прерван в какой-то момент, создается новый экземпляр провайдера сохранения, имеющий другой идентификатор узла.

Значение времени ожидания блокировки имеет значение по умолчанию 5 минут, можно указать другое значение времени ожидания при вызове Load.

В этом разделе

См. также