Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Das Beispiel CustomCompositeNativeActivity sample veranschaulicht, wie Sie eine NativeActivity schreiben, die andere Activity-Objekte einplant, um den Ablauf der Ausführung eines Workflows zu steuern. Zur Veranschaulichung dieses Vorgangs werden in diesem Beispiel zwei häufige Ablaufsteuerungen verwendet: Sequence und While.
Beispieldetails
Beginnend bei MySequence muss als Erstes beachtet werden, dass diese von NativeActivity abgeleitet ist.
NativeActivity ist das Activity-Objekt, das die volle Bandbreite der Workflowlaufzeit durch den NativeActivityContext verfügbar macht, der an die Execute-Methode übergeben wurde.
MySequence macht eine öffentliche Auflistung von Activity-Objekten verfügbar, die vom Workflowautor aufgefüllt werden. Bevor der Workflow ausgeführt wird, ruft die Workflowlaufzeit die CacheMetadata-Methode in jeder Aktivität in einem Workflow auf. Während dieses Prozesses legt die Laufzeitumgebung Beziehungen zwischen übergeordneten und untergeordneten Elementen für die Datenbereichsverwaltung und Lebensdauerverwaltung fest. Die Standardimplementierung der CacheMetadata-Methode verwendet die TypeDescriptor-Instanzklasse für die MySequence-Aktivität, um eine beliebige öffentliche Eigenschaft des Typs Activity oder IEnumerable<Activity> als untergeordnete Elemente der MySequence-Aktivität hinzuzufügen.
Immer dann, wenn eine Aktivität eine öffentliche Auflistung von untergeordneten Aktivitäten verfügbar macht, ist es wahrscheinlich, dass diese untergeordneten Aktivitäten ihren Zustand teilen. Empfohlen wird, dass die übergeordnete Aktivität, in diesem Fall MySequence, auch eine Sammlung von Variablen bereitstellt, durch die die untergeordneten Aktivitäten dies erreichen können. Ähnlich wie bei Kinderaktivitäten fügt die CacheMetadata-Methode öffentliche Eigenschaften des Typs Variable oder IEnumerable<Variable> als der MySequence-Aktivität zugeordnete Variablen hinzu.
Neben den öffentlichen Variablen, die von den untergeordneten Elementen von MySequence bearbeitet werden, muss MySequence auch die Position aufzeichnen, an der es sich bei der Ausführung der untergeordneten Elemente befindet. Hierfür wird eine private Variable, currentIndex, verwendet. Diese Variable wird als Teil der MySequence-Umgebung registriert, indem ein Aufruf der AddImplementationVariable-Methode innerhalb der Methode MySequence der Aktivität CacheMetadata hinzugefügt wird. Die Activity-Objekte, die zur MySequenceActivities-Sammlung hinzugefügt wurden, können nicht auf auf diese Weise hinzugefügte Variablen zugreifen.
Wenn MySequence von der Laufzeit ausgeführt wird, ruft die Laufzeit die Execute-Methode auf und übergibt einen NativeActivityContext.
NativeActivityContext ist der Proxy der Aktivität in der Laufzeit zum Dereferenzieren von Argumenten und Variablen sowie zum Planen von anderen Activity-Objekten oder ActivityDelegates.
MySequence verwendet eine InternalExecute-Methode, um die Planungslogik für das erste Kind und alle nachfolgenden Kinder in einer einzigen Methode zu kapseln. Der Vorgang beginnt mit dem Dereferenzieren von currentIndex. Wenn es der Anzahl in der Activities-Auflistung entspricht, ist die Sequenz abgeschlossen, die Aktivität wird zurückgegeben, ohne dass weitere Aufgaben geplant werden, und die Laufzeit verschiebt sie in den Zustand Closed. Wenn currentIndex geringer als die Anzahl der Aktivitäten ist, wird das nächste Kind aus der Activities-Sammlung abgerufen. Dann ruft MySequenceScheduleActivity auf, wobei das zu planende Kind und ein CompletionCallback, der auf die InternalExecute-Methode zeigt, übergeben werden. Schließlich wird der currentIndex inkrementiert, und die Steuerung wird an die Laufzeitumgebung zurückgegeben. Solange eine Instanz von MySequence über ein geplantes untergeordnetes Activity-Objekt verfügt, wird diese von der Laufzeit als im ausgeführten Zustand betrachtet.
Sobald die untergeordnete Aktivität abgeschlossen ist, wird der CompletionCallback ausgeführt. Die Schleife fängt wieder von vorne an. Wie auch Execute, verwendet ein CompletionCallback einen NativeActivityContext, sodass die Implementierung Zugriff auf die Laufzeit erhält.
MyWhile unterscheidet sich von MySequence dadurch, dass es ein einzelnes Activity-Objekt wiederholt plant und ein Activity<TResult><bool>-Wert namens Condition verwendet, um zu ermitteln, ob diese Planung stattfinden soll. Wie auch MySequence, verwendet MyWhile eine InternalExecute-Methode, um seine Planungslogik zu zentralisieren. Es programmiert den ConditionActivity<bool>-Wert mit einem CompletionCallback<TResult><bool>-Wert und nennt ihn OnEvaluationCompleted. Wenn die Ausführung von Condition abgeschlossen ist, wird das Ergebnis durch diesen CompletionCallback in einem stark typisierten Parameter mit dem Namen result verfügbar. Wenn true, MyWhileScheduleActivity aufruft, werden das BodyActivity-Objekt und InternalExecute als CompletionCallback übergeben. Wenn die Ausführung von Body abgeschlossen ist, wird Condition erneut in InternalExecute geplant, und der Zyklus beginnt von vorne. Wenn der Conditionfalse zurückgibt, übergibt eine Instanz von MyWhile die Steuerung zurück an die Laufzeit, ohne die Ausführung von Body zu planen, und die Laufzeit bewegt ihn in den Zustand Closed.
Einrichten, Erstellen und Ausführen des Beispiels.
Öffnen Sie die Beispiellösung Composite.sln in Visual Studio.
Erstellen Sie die Lösung, und führen Sie sie aus.