Vlastní skládání využívající nativní aktivitu
Ukázka CustomCompositeNativeActivity ukazuje, jak napsat NativeActivity , který naplánuje další Activity objekty pro řízení toku provádění pracovního postupu. Tato ukázka používá dva běžné řídicí toky, sequence a While, k předvedení toho, jak to udělat.
Ukázkové podrobnosti
MySequence
Počínaje , první věc, kterou si všimněte, je, že je odvozen od NativeActivity. NativeActivityActivity je objekt, který zveřejňuje úplnou šířku modulu runtime pracovního postupu prostřednictvím NativeActivityContext předávaného metoděExecute
.
MySequence
zveřejňuje veřejnou kolekci Activity objektů, které se naplní autorem pracovního postupu. Před spuštěním pracovního postupu modul runtime pracovního postupu volá metodu CacheMetadata pro každou aktivitu v pracovním postupu. Během tohoto procesu modul runtime vytváří vztahy nadřazenosti a podřízenosti pro správu rozsahu dat a životnosti. Výchozí implementace CacheMetadata metody používá TypeDescriptor třídu instance aktivity MySequence
k přidání jakékoli veřejné vlastnosti typu Activity nebo IEnumerableActivity<> jako podřízené MySequence
položky aktivity.
Kdykoli aktivita zveřejňuje veřejnou kolekci podřízených aktivit, je pravděpodobné, že tyto podřízené aktivity sdílejí stav. Je osvědčeným postupem pro nadřazenou aktivitu v tomto případě MySequence
také zveřejnit kolekci proměnných, pomocí kterých mohou podřízené aktivity dosáhnout. Podobně jako podřízené aktivity CacheMetadata metoda přidává veřejné vlastnosti typu Variable nebo IEnumerableVariable<> jako proměnné přidružené k aktivitě.MySequence
Kromě veřejných proměnných, které jsou manipulovány podřízenými MySequence
objekty , MySequence
musí také sledovat, kde se provádí jeho podřízené položky. K tomuto účelu používá privátní proměnnou currentIndex
. Tato proměnná je registrována jako součást MySequence
prostředí přidáním volání AddImplementationVariable metody v rámci MySequence
metody aktivity CacheMetadata . Objekty Activity přidané do MySequence
Activities
kolekce nemají přístup k proměnným přidaným tímto způsobem.
Při MySequence
spuštění modulem runtime modul runtime volá svou Execute metodu předáváním NativeActivityContext. Jedná NativeActivityContext se o proxy server aktivity zpět do modulu runtime pro dereferencování argumentů a proměnných a také plánování dalších Activity objektů nebo ActivityDelegates
. MySequence
používá metodu InternalExecute
zapouzdření logiky plánování prvního podřízeného objektu a všech následujících podřízených položek v jedné metodě. Začíná tím, že se dereferencuje currentIndex
. Pokud se rovná počtu v Activities
kolekci, pak se posloupnost dokončí, aktivita se vrátí bez plánování jakékoli práce a modul runtime ho přesune do Closed stavu. currentIndex
Pokud je menší než počet aktivit, další podřízená položka se získá z Activities
kolekce a MySequence
volání ScheduleActivity, předání podřízené položky, která má být naplánována, a CompletionCallback to ukazuje na metoduInternalExecute
. Nakonec se currentIndex
zvýší a řízení se vrátí zpět do modulu runtime. Pokud má instance MySequence
naplánovaný podřízený Activity objekt, modul runtime ho považuje za spuštěný.
Po dokončení podřízené aktivity se CompletionCallback spustí. Smyčka pokračuje shora. Podobně jako Execute
, přebírá CompletionCallback , NativeActivityContextdává implementátoru přístup k modulu runtime.
MyWhile
liší se od MySequence
toho, že plánuje jeden Activity objekt opakovaně a v tom, že používá logickou hodnotu> pojmenovanou Activity<TResult><Condition
k určení, zda má dojít k tomuto plánování. Podobně jako MySequence
, MyWhile
používá metodu InternalExecute
k centralizaci jeho plánovací logiky. Naplánuje Condition
<Activitybool> s logickou CompletionCallback<TResult><hodnotou> s názvem .OnEvaluationCompleted
Po dokončení se Condition
jeho výsledek zpřístupní v CompletionCallback parametru silného typu s názvem result
. Pokud true
, volání ScheduleActivity, MyWhile
předávání Body
Activity objektu a InternalExecute
jako CompletionCallback. Po dokončení Body
Condition
se znovu naplánuje spuštění InternalExecute
smyčky . Když se Condition
vrátí false
, instance MyWhile
dává řízení zpět modulu runtime bez plánování Body
a modul runtime ho přesune do Closed stavu.
Nastavení, sestavení a spuštění ukázky
Otevřete ukázkové řešení Composite.sln v sadě Visual Studio.
Sestavte a spusťte řešení.