Partilhar via


Composto personalizado usando atividade nativa

O exemplo CustomCompositeNativeActivity demonstra como escrever um NativeActivity que agenda outros Activity objetos para controlar o fluxo de execução de um fluxo de trabalho. Este exemplo usa dois fluxos de controle comuns, Sequence e While, para demonstrar como fazer isso.

Detalhes da amostra

Começando com MySequence, a primeira coisa a notar é que deriva de NativeActivity. NativeActivity é o Activity objeto que expõe toda a amplitude do tempo de execução do fluxo de trabalho através do NativeActivityContext passado para o Execute método.

MySequence Expõe uma coleção pública de objetos que é preenchida pelo autor do fluxo de Activity trabalho. Antes de executar o fluxo de trabalho, o tempo de execução do fluxo de trabalho chama o CacheMetadata método em cada atividade em um fluxo de trabalho. Durante esse processo, o tempo de execução estabelece relações pai-filho para escopo de dados e gerenciamento de tempo de vida. A implementação padrão do método usa a classe de CacheMetadata instância para a MySequence atividade para adicionar qualquer propriedade pública do tipo Activity ou IEnumerable><Activitycomo filhos da MySequence atividade.TypeDescriptor

Sempre que uma atividade expõe uma coleção pública de atividades infantis, é provável que essas atividades infantis compartilhem o estado. É uma boa prática para a atividade dos pais, neste caso MySequence, expor também uma coleção de variáveis através das quais as atividades da criança podem realizar isso. Como atividades filhas, o CacheMetadata método adiciona propriedades públicas do tipo Variable ou IEnumerableVariable<> como variáveis associadas à MySequence atividade.

Além das variáveis públicas, que são manipuladas pelos filhos de MySequence, MySequence também deve acompanhar onde está na execução de seus filhos. Ele usa uma variável privada, currentIndex, para conseguir isso. Essa variável é registrada como parte do MySequence ambiente adicionando uma chamada ao AddImplementationVariable método dentro do MySequence método da CacheMetadata atividade. Os Activity objetos adicionados à MySequence Activities coleção não podem acessar variáveis adicionadas dessa maneira.

Quando MySequence é executado pelo tempo de execução, o tempo de execução chama seu Execute método, passando em um NativeActivityContextarquivo . O NativeActivityContext é o proxy da atividade de volta ao tempo de execução para desreferenciar argumentos e variáveis, bem como agendar outros Activity objetos, ou ActivityDelegates. MySequence usa um InternalExecute método para encapsular a lógica de agendamento do primeiro filho e todos os filhos subsequentes em um único método. Começa por desreferenciar o currentIndex. Se for igual à contagem na Activities coleção, a sequência é concluída, a atividade retorna sem agendar nenhum trabalho e o tempo de execução a move para o Closed estado. Se o currentIndex for menor que a contagem de atividades, a próxima criança é obtida a Activities partir da coleta e MySequence chama, ScheduleActivitypassando na criança a ser agendada e uma CompletionCallback que aponta para o InternalExecute método. Finalmente, o é incrementado e o currentIndex controle é reproduzido para o tempo de execução. Desde que uma instância de tenha um objeto filho Activity agendado, o tempo de MySequence execução considera-o no estado Executor.

Quando a atividade filho é concluída, a CompletionCallback é executada. O loop continua a partir do topo. Como Execute, a CompletionCallback leva um NativeActivityContext, dando ao implementador acesso ao tempo de execução.

MyWhile difere na MySequence medida em que ele agenda um único Activity objeto repetidamente, e em que ele usa um Activity<TResult><bool> nomeado Condition para determinar se esse agendamento deve ocorrer. Como MySequence, MyWhile usa um InternalExecute método para centralizar sua lógica de agendamento. Ele agenda o Condition<Activitybool> com um CompletionCallback<TResult><bool> chamado .OnEvaluationCompleted Quando a execução do é concluída, seu resultado fica disponível através disso CompletionCallback em um parâmetro fortemente tipado Condition chamado result. Se true, MyWhile chama ScheduleActivity, passando no BodyActivity objeto e InternalExecute como o CompletionCallback. Quando a execução de for concluída, Condition será agendada Body novamente em InternalExecute, iniciando o loop novamente. Quando o Condition retorna false, uma instância de devolve o controle ao tempo de execução sem agendar o e o Body tempo de MyWhile execução o move para o Closed estado.

Para configurar, compilar e executar o exemplo

  1. Abra a solução de exemplo Composite.sln no Visual Studio.

  2. Crie e execute a solução.