Atividade nativo de usar composta personalizada

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

Detalhes de exemplo

Iniciando com MySequence, a primeira coisa para observar que é derivada de NativeActivity. NativeActivity é o objeto de Activity que expõe a largura total do runtime de fluxo de trabalho com NativeActivityContext passado para o método de Execute .

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

Sempre que uma atividade expõe uma coleção pública de atividades filhos, é provável estado filho de compartilhamento dessas atividades. É uma prática recomendada para atividades pai, nesse caso MySequence, também expor uma coleção de variáveis com que as atividades filho podem fazer isso. Assim como as atividades filhas, o método CacheMetadata adiciona propriedades públicas do tipo Variable ou IEnumerable<Variable> como variáveis associadas à atividade MySequence.

Além de variáveis públicas, que são manipulados pelos filhos de MySequence, MySequence também deve manter controle de onde está em execução de seus filhos. Usa uma variável particular, currentIndex, para fazer isso. Essa variável é registrada como parte do ambiente MySequence adicionando uma chamada ao método AddImplementationVariable dentro do método CacheMetadata da atividade MySequence. Os objetos Activity adicionados à coleção MySequenceActivities não podem acessar variáveis adicionadas dessa maneira.

Quando MySequence é executado em runtime, o runtime chama o método de Execute , passando NativeActivityContext. O NativeActivityContext é o proxy da atividade de volta ao tempo de execução para desreferenciar argumentos e variáveis, bem como agendar outros objetos Activity ou ActivityDelegates. MySequence usa um método de InternalExecute para encapsular a lógica de agendar o primeiro filho e todos os filhos subsequentes em um único método. Inicia desreferenciando currentIndex. Se for igual a contagem na coleção de Activities , então a sequência está concluída, a atividade retorna agendar sem qualquer trabalho e o runtime movê-lo no estado de Closed . Se o currentIndex for menor que a contagem de atividades, o próximo filho é obtido da coleção Activities e MySequence chama ScheduleActivity, passando o filho a ser agendado e um CompletionCallback que aponta para o método InternalExecute. Finalmente, currentIndex é incrementado e o controle é rendido de volta para o runtime. Como uma instância de MySequence tem um objeto filho de Activity agendada, o runtime considera-o estar no estado executando.

Quando a atividade filho termina, CompletionCallback é executado. O loop continua a parte superior. Como Execute, CompletionCallback leva NativeActivityContext, fornecendo acesso do implementador em runtime.

MyWhile difere de MySequence porque agenda um único objeto Activity repetidamente e usa um Activity<TResult><bool> chamado Condition para determinar se esse agendamento deve ocorrer. Como MySequence, MyWhile usa um método de InternalExecute para centralizar sua lógica de programação. Ele agenda o ConditionActivity<bool> com um CompletionCallback<TResult><bool> chamado OnEvaluationCompleted. Quando a execução de Condition é concluída, o resultado fica disponível com esse CompletionCallback em um parâmetro fortemente tipado chamado result. Se true, MyWhile chama ScheduleActivity, passando o objeto BodyActivity e InternalExecute como o CompletionCallback. Quando a execução de Body terminar, Condition obtém agendada novamente em InternalExecute, iniciar o loop sobre novamente. Quando Condition retorna false, uma instância de MyWhile fornece o controle de volta para o runtime sem agendar Body e o runtime movê-lo ao estado de Closed .

Para configurar, compilar, e executar o exemplo

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

  2. Compile e execute a solução.