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

MySequencePočí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ě MySequencetaké 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 MySequenceobjekty , 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 MySequenceActivities 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.

MyWhileliší 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í BodyActivity objektu a InternalExecute jako CompletionCallback. Po dokončení BodyCondition se znovu naplánuje spuštění InternalExecutesmyč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

  1. Otevřete ukázkové řešení Composite.sln v sadě Visual Studio.

  2. Sestavte a spusťte řešení.