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 Body
Activity 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
Abra a solução de exemplo Composite.sln no Visual Studio.
Crie e execute a solução.