Dela via


Anpassad sammansatt med inbyggd aktivitet

Exemplet CustomCompositeNativeActivity visar hur du skriver en NativeActivity som schemalägger andra Activity objekt för att styra flödet för ett arbetsflödes körning. Det här exemplet använder två vanliga kontrollflöden, Sekvens och Medan, för att visa hur du gör detta.

Exempelinformation

Från och med MySequenceär det första att märka att det härleds från NativeActivity. NativeActivity är det Activity objekt som exponerar hela bredden av arbetsflödeskörningen via den NativeActivityContext som skickas Execute till metoden.

MySequence exponerar en offentlig samling Activity objekt som fylls i av arbetsflödesförfattaren. Innan arbetsflödet körs anropar arbetsflödeskörningen CacheMetadata metoden för varje aktivitet i ett arbetsflöde. Under den här processen etablerar körningen överordnade och underordnade relationer för dataomfång och livslängdshantering. Standardimplementeringen av CacheMetadata metoden använder TypeDescriptor instansklassen MySequence för aktiviteten för att lägga till en offentlig egenskap av typen Activity ellerActivity> IEnumerable<som underordnade MySequence aktiviteter.

När en aktivitet exponerar en offentlig samling underordnade aktiviteter är det troligt att dessa underordnade aktiviteter delar tillstånd. Det är bästa praxis för den överordnade aktiviteten, i det här fallet MySequence, att också exponera en samling variabler genom vilka de underordnade aktiviteterna kan åstadkomma detta. Precis som underordnade aktiviteter CacheMetadata lägger metoden till offentliga egenskaper av typen Variable eller IEnumerable><Variablesom variabler som är associerade med MySequence aktiviteten.

Förutom de offentliga variablerna, som manipuleras av barnen MySequencei , MySequence måste också hålla reda på var det är i körningen av sina barn. Den använder en privat variabel, currentIndex, för att åstadkomma detta. Den här variabeln registreras som en del av MySequence miljön genom att lägga till ett anrop till AddImplementationVariable metoden i MySequence aktivitetens CacheMetadata metod. Objekten Activity som läggs till i MySequence Activities samlingen kan inte komma åt variabler som lagts till på det här sättet.

När MySequence körs av körningen anropar körningen dess Execute metod och skickar in en NativeActivityContext. NativeActivityContext är aktivitetens proxy tillbaka till körningen för avreferering av argument och variabler samt schemaläggning av andra Activity objekt, eller ActivityDelegates. MySequence använder en InternalExecute metod för att kapsla in logiken för att schemalägga det första underordnade och alla efterföljande underordnade i en enda metod. Det börjar med att dereferera currentIndex. Om det är lika med antalet i Activities samlingen är sekvensen klar, aktiviteten returneras utan att schemalägga något arbete och körningen flyttar den till Closed tillståndet. currentIndex Om är mindre än antalet aktiviteter hämtas nästa underordnade från Activities samlingen och MySequence anropar ScheduleActivity, skickar in det underordnade som ska schemaläggas och ett CompletionCallback som pekar på InternalExecute metoden. Slutligen currentIndex ökas och kontrollen returneras tillbaka till körningen. Så länge en instans av MySequence har ett underordnat Activity objekt schemalagt anser körningen att det är i körningstillståndet.

När den underordnade aktiviteten har slutförts körs den CompletionCallback . Loopen fortsätter uppifrån. Som Execute, en CompletionCallback tar en NativeActivityContext, vilket ger implementeraren åtkomst till körningen.

MyWhile skiljer sig från MySequence i och med att det schemalägger ett enskilt Activity objekt upprepade gånger och använder en Activity<TResult><bool> med namnet Condition för att avgöra om den här schemaläggningen ska ske. Som MySequenceanvänder MyWhile en InternalExecute metod för att centralisera sin schemaläggningslogik. Den schemalägger bool> medActivity<Condition en<CompletionCallback<TResult> bool med> namnet .OnEvaluationCompleted När körningen av Condition har slutförts blir resultatet tillgängligt via detta CompletionCallback i en starkt typad parameter med namnet result. Om trueanropar ScheduleActivityMyWhile , skickar du objektet BodyActivity och InternalExecute som CompletionCallback. När körningen av Body slutförs schemaläggs Condition du igen i InternalExecuteoch startar loopen igen. Condition När returnerar falseger en instans av MyWhile kontrollen tillbaka till körningen utan att Body schemalägga och körningen flyttar den Closed till tillståndet.

Så här konfigurerar du, skapar och kör exemplet

  1. Öppna den Composite.sln exempellösningen i Visual Studio.

  2. Skapa och kör lösningen.