Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um participante de persistência pode participar de uma operação de persistência (Salvar ou Carregar) disparada por um host de aplicativo. O .NET Framework 4.6.1 é fornecido com duas classes abstratas, PersistenceParticipant e PersistenceIOParticipant, que você pode usar para criar um participante de persistência. Um participante de persistência deriva de uma dessas classes, implementa-se os métodos de interesse, e então adiciona uma instância da classe à coleção de WorkflowExtensions em WorkflowServiceHost . O aplicativo host pode procurar essas extensões de fluxo de trabalho para manter uma instância de fluxo de trabalho e chama métodos apropriados nos participantes de persistência em momentos apropriadas.
A lista a seguir descreve as tarefas executadas pelo subsistema de persistência em diferentes estágios da operação Persist (Save). Os participantes de persistência são usados em terceira e quartas etapas. Se o participante for um participante de E/S (um participante de persistência que também participa de operações de E/S), o participante também será usado no sexto estágio.
Coleta valores internos, incluindo o estado do fluxo de trabalho, marcadores, variáveis mapeadas e carimbo de data/hora.
Coleta todos os participantes de persistência que foram adicionados à coleção de extensão associada com a instância de fluxo de trabalho.
Chama o método de CollectValues implementado por todos os participantes de persistência.
Chama o método de MapValues implementado por todos os participantes de persistência.
Persista ou salve o fluxo de trabalho no repositório de persistência.
Chama o método BeginOnSave em todos os participantes de E/S de persistência. Se o participante não for um participante de E/S, essa tarefa será ignorada. Se o episódio de persistência for transacional, a transação será fornecida na propriedade Transaction.Current.
Aguarda que todos os participantes de persistência terminem. Se todos os participantes são bem-sucedidas em manter dados de instância, confirmações a transação.
Um participante de persistência deriva da classe PersistenceParticipant e pode implementar os métodos CollectValues e MapValues . Um participante de E/S de persistência deriva da classe PersistenceIOParticipant e pode implementar o método BeginOnSave além de implementar os métodos CollectValues e MapValues .
Cada estágio é concluído antes do início da próxima etapa. Por exemplo, os valores são coletados de todos os participantes de persistência no primeiro estágio. Em seguida, todos os valores coletados no primeiro estágio são fornecidos a todos os participantes de persistência no segundo estágio para mapeamento. Em seguida, todos os valores coletados e mapeados no primeiro e segundo estágios são fornecidos ao provedor de persistência no terceiro estágio e assim por diante.
A lista a seguir descreve as tarefas executadas pelo subsistema de persistência em diferentes estágios da operação de carregamento. Os participantes de persistência são usados na quarta fase. Os participantes de E/S de persistência (participantes de persistência que também participam em operações de E/S) também são usados na terceira etapa.
Coleta todos os participantes de persistência que foram adicionados à coleção de extensão associada com a instância de fluxo de trabalho.
Carrega o fluxo de trabalho do armazenamento de persistência.
Chama o BeginOnLoad em todos os participantes de E/S de persistência e espera todos os participantes de persistência para concluir. Se o episódio de persistência for transacional, a transação será fornecida em Transaction.Current.
Carrega a instância de fluxo de trabalho na memória com base nos dados recuperados do repositório de persistência.
Chama o PublishValues em cada participante de persistência.
Um participante de persistência deriva da classe PersistenceParticipant e pode implementar o método PublishValues . Um participante de E/S de persistência deriva da classe PersistenceIOParticipant e pode implementar o método BeginOnLoad , além de implementar o método PublishValues .
Ao carregar uma instância de fluxo de trabalho, o provedor de persistência cria um bloqueio nessa instância. Isso impede que a instância seja carregada por mais de um host em um cenário de vários nós. Se você tentar carregar uma instância de fluxo de trabalho bloqueada, verá uma exceção como a seguinte: a exceção " System.ServiceModel.Persistence.InstanceLockException: a operação solicitada não pôde ser concluída porque o bloqueio da instância '000000000-00000-00000-00000000000000' não pôde ser adquirido". Esse erro é causado quando ocorre um dos seguintes procedimentos:
Em um cenário de vários nós, a instância é carregada por outro host. Há algumas maneiras diferentes de resolver esses tipos de conflitos: encaminhar o processamento para o nó que possui o bloqueio e tentar novamente ou forçar a carga que fará com que o outro host não consiga salvar seu trabalho.
Em um cenário de único nó e no host falhou. Quando o host é iniciado novamente (reciclagem de processo ou criação de uma nova fábrica de provedores de persistência), o novo host tenta carregar uma instância que permanece bloqueada pelo host antigo porque o bloqueio ainda não expirou.
Em um cenário de único nó e na instância em questão foi anuladas em algum ponto e uma nova instância do provedor de persistência é criada que tenha uma identificação diferente do host
O valor do tempo limite de bloqueio tem um valor padrão de 5 minutos, você pode especificar um valor de tempo limite diferente ao chamar Load.