Delen via


Aangepast samengesteld met systeemeigen activiteit

Het voorbeeld CustomCompositeNativeActivity laat zien hoe u een NativeActivity script schrijft waarmee andere Activity objecten worden gepland om de stroom van de uitvoering van een werkstroom te beheren. In dit voorbeeld worden twee algemene besturingsstromen, Reeks en While gebruikt om te laten zien hoe u dit doet.

Voorbeelddetails

Beginnend met MySequence, het eerste wat u moet merken is dat het is afgeleid van NativeActivity. NativeActivity is het Activity object dat de volledige breedte van de werkstroomruntime beschikbaar maakt via de NativeActivityContext doorgegeven aan de Execute methode.

MySequence maakt een openbare verzameling objecten beschikbaar die worden ingevuld door de auteur van Activity de werkstroom. Voordat de werkstroom wordt uitgevoerd, roept de werkstroomruntime de CacheMetadata methode aan voor elke activiteit in een werkstroom. Tijdens dit proces brengt de runtime relaties tussen bovenliggende en onderliggende items tot stand voor gegevensbereiken en levensduurbeheer. De standaard implementatie van de CacheMetadata methode maakt gebruik van de TypeDescriptor instantieklasse voor de MySequence activiteit om een openbare eigenschap van het type Activity of IEnumerableActivity<> als onderliggende eigenschap van de MySequence activiteit toe te voegen.

Wanneer een activiteit een openbare verzameling onderliggende activiteiten beschikbaar maakt, is dit waarschijnlijk de status van de onderliggende activiteiten. Het is een best practice voor de bovenliggende activiteit, in dit geval MySequence, om ook een verzameling variabelen beschikbaar te maken waarmee de onderliggende activiteiten dit kunnen doen. Net als onderliggende activiteiten voegt de CacheMetadata methode openbare eigenschappen van het type Variable of IEnumerableVariable<> als variabelen toe die aan de MySequence activiteit zijn gekoppeld.

Naast de openbare variabelen, die worden gemanipuleerd door de onderliggende MySequencevariabelen, MySequence moet ook bijhouden waar het zich in de uitvoering van de onderliggende elementen bevindt. Hiervoor wordt een privévariabele currentIndexgebruikt. Deze variabele wordt geregistreerd als onderdeel van de MySequence omgeving door een aanroep toe te voegen aan de methode binnen de AddImplementationVariable methode van CacheMetadata de MySequence activiteit. De Activity objecten die aan de MySequence Activities verzameling zijn toegevoegd, hebben op deze manier geen toegang tot variabelen.

Wanneer MySequence deze wordt uitgevoerd door de runtime, roept de runtime de methode aan Execute , waarbij een NativeActivityContext. Dit NativeActivityContext is de proxy van de activiteit terug in de runtime voor het deducteren van argumenten en variabelen, evenals het plannen van andere Activity objecten, of ActivityDelegates. MySequence gebruikt een InternalExecute methode voor het inkapselen van de logica van het plannen van het eerste onderliggende element en alle volgende onderliggende elementen in één methode. Het begint met het uitstellen van de currentIndex. Als deze gelijk is aan het aantal in de Activities verzameling, wordt de reeks voltooid, wordt de activiteit geretourneerd zonder werk te plannen en wordt de runtime verplaatst naar de Closed status. Als het currentIndex aantal activiteiten kleiner is dan het aantal activiteiten, wordt het volgende kind verkregen uit de Activities verzameling en MySequence aanroepen ScheduleActivity, waarbij het kind wordt doorgegeven dat moet worden gepland en een CompletionCallback die verwijst naar de InternalExecute methode. Ten slotte wordt het currentIndex verhoogd en wordt de controle teruggegeven aan de runtime. Zolang een exemplaar van MySequence een onderliggend Activity object is gepland, beschouwt de runtime het als de uitvoeringsstatus.

Wanneer de onderliggende activiteit is voltooid, wordt deze CompletionCallback uitgevoerd. De lus gaat verder vanaf de bovenkant. Een neemt NativeActivityContexteen CompletionCallback Execute, waardoor de implementeerfunctie toegang heeft tot de runtime.

MyWhile verschilt van MySequence het feit dat één object herhaaldelijk wordt gepland Activity en dat er een Activity<TResult><bool> met de naam Condition wordt gebruikt om te bepalen of deze planning moet plaatsvinden. Net als MySequencebij een MyWhile methode wordt een InternalExecute methode gebruikt om de planningslogica te centraliseren. Het plant de Condition<Activitybool> met een bool> met de CompletionCallback<TResult><naam .OnEvaluationCompleted Wanneer de uitvoering is Condition voltooid, wordt het resultaat hiervan beschikbaar in CompletionCallback een sterk getypte parameter met de naam result. Als true, MyWhile aanroepen ScheduleActivity, doorgeven in hetActivity Bodyobject en InternalExecute als de CompletionCallback. Wanneer de uitvoering van Body de bewerking is voltooid, Condition wordt deze opnieuw InternalExecutegepland en wordt de lus opnieuw gestart. Wanneer de Condition retourneert false, geeft een exemplaar van MyWhile de runtime controle terug zonder de planning en Body de runtime verplaatst deze naar de Closed status.

Het voorbeeld instellen, compileren en uitvoeren

  1. Open de Composite.sln voorbeeldoplossing in Visual Studio.

  2. Bouw de oplossing en voer deze uit.