Egyéni összetettség natív tevékenység használatával
A CustomCompositeNativeActivity minta bemutatja, hogyan írhat olyan NativeActivity objektumokat, amelyek más Activity objektumokat ütemeznek a munkafolyamat végrehajtásának szabályozásához. Ez a minta két gyakori vezérlőfolyamatot (Sequence and While) használ a művelet menetének bemutatásához.
Minta részletei
MySequence
Az első dolog, amit észre kell venni , hogy származik NativeActivity. NativeActivity az az Activity objektum, amely a munkafolyamat-futtatókörnyezet teljes szélességét elérhetővé teszi a NativeActivityContext metódusnak Execute
átadott módon.
MySequence
nyilvános objektumgyűjteményt Activity tesz elérhetővé, amelyet a munkafolyamat szerzője tölt fel. A munkafolyamat végrehajtása előtt a munkafolyamat-futtatókörnyezet meghívja a metódust a CacheMetadata munkafolyamat minden tevékenységén. A folyamat során a futtatókörnyezet szülő-gyermek kapcsolatokat hoz létre az adatok hatókörkezeléséhez és az élettartam-kezeléshez. A metódus alapértelmezett implementációja a CacheMetadata tevékenység példányosztályát használja a MySequence
tevékenységhez bármilyen típusú vagy gyermek MySequence
típusú nyilvános tulajdonság<> ActivityActivityIEnumerablehozzáadásához.TypeDescriptor
Amikor egy tevékenység gyermektevékenységek nyilvános gyűjteményét teszi elérhetővé, valószínűleg ezek a gyermektevékenységek osztoznak az állapoton. Ebben az esetben MySequence
ajánlott a szülőtevékenységnek olyan változók gyűjteményét is elérhetővé tenni, amelyeken keresztül a gyermektevékenységek ezt el tudják érni. A gyermektevékenységekhez hasonlóan a CacheMetadata metódus a tevékenységhez társított nyilvános típusú Variable vagy IEnumerableVariable<> változókat is hozzáadja.MySequence
A gyermekek által MySequence
MySequence
manipulált nyilvános változókon kívül azt is nyomon kell követni, hogy hol van a gyermekei végrehajtásában. Ehhez egy privát változót currentIndex
használ. Ez a változó a MySequence
környezet részeként van regisztrálva, ha egy hívást ad hozzá a AddImplementationVariable metódushoz a MySequence
tevékenység metódusán CacheMetadata belül. A Activity gyűjteményhez hozzáadott objektumok nem férnek hozzá az MySequence
Activities
így hozzáadott változókhoz.
Amikor MySequence
a futtatókörnyezet végrehajtja, a futtatókörnyezet meghívja annak metódusát Execute , és egy NativeActivityContext. A NativeActivityContext tevékenység proxyja visszakerül a futtatókörnyezetbe az argumentumok és változók elhalasztására, valamint más Activity objektumok ütemezésére vagy ActivityDelegates
. MySequence
egy metódussal InternalExecute
foglalja össze az első gyermek és az összes későbbi gyermek egyetlen metódusba való ütemezésének logikáját. A művelet a halasztással currentIndex
kezdődik. Ha megegyezik a Activities
gyűjtemény számával, akkor a sorozat befejeződött, a tevékenység munka ütemezése nélkül tér vissza, és a futtatókörnyezet áthelyezi az Closed állapotba. Ha ez currentIndex
kisebb, mint a tevékenységek száma, a rendszer a következő gyermeket a gyűjteményből és MySequence
a Activities
hívásokból ScheduleActivityszerzi be, és átadja a gyermeknek az ütemezést, és a CompletionCallback metódusra InternalExecute
mutat. Végül a rendszer növeli a currentIndex
léptetést, és a vezérlés visszaáll a futtatókörnyezetre. Mindaddig, amíg egy példányhoz MySequence
gyermekobjektum Activity van ütemezve, a futtatókörnyezet végrehajtási állapotúnak tekinti.
Amikor a gyermektevékenység befejeződik, a rendszer végrehajtja.CompletionCallback A hurok felülről folytatódik. Például Execute
egy CompletionCallback olyan, NativeActivityContextamely hozzáférést ad a megvalósítónak a futtatókörnyezethez.
MyWhile
abban különbözikMySequence
, hogy ismétlődően ütemez egy Activity objektumot, és egy elnevezett Condition
bool> használatával Activity<TResult><határozza meg, hogy ez az ütemezés történjen-e. Például MySequence
egy MyWhile
InternalExecute
metódus használatával központosítja az ütemezési logikát. Beütemezi a Condition
<Activitybool egy<CompletionCallback<TResult> bool>> nevű .OnEvaluationCompleted
Ha a végrehajtás Condition
befejeződött, az eredmény egy erősen gépelt, elnevezett result
paraméterben válik elérhetővéCompletionCallback. Ha true
, MyWhile
hívás ScheduleActivity, továbbítás az Body
Activity objektumban és InternalExecute
a CompletionCallback. Amikor a végrehajtás befejeződik Body
, Condition
a rendszer újra ütemezi a InternalExecute
ciklust, és újra elindítja a ciklust. Amikor a Condition
visszaadott false
érték egy példánya MyWhile
a futtatókörnyezethez ad vissza vezérlést anélkül, hogy ütemezni szeretné a Body
futtatókörnyezetet, és a futtatókörnyezet áthelyezi azt az Closed állapotba.
A minta beállítása, összeállítása és futtatása
Nyissa meg a Composite.sln mintamegoldást a Visual Studióban.
Fordítsa le és futtassa a megoldást.