Freigeben über


Benutzerdefinierte Zusammensetzungen mit NativeActivity

Dieses Thema gilt für Windows Workflow Foundation 4.

In diesem Beispiel wird veranschaulicht, wie eine NativeActivity geschrieben wird, die andere Activity-Objekte plant, um den Fluss 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 ist die erste Sache, die zu beachten ist, dass diese Ablaufsteuerung von NativeActivity abgeleitet wird. NativeActivity ist das Activity-Objekt, das die volle Bandbreite der ActivityRuntime über den NativeActivityContext verfügbar macht, der an die Execute-Methode übergeben wird.

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 Laufzeit Beziehungen zwischen übergeordneten und untergeordneten Elementen für Datenbereiche 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 hinzuzufügen, oder IEnumerable<Activity> als untergeordnete Elemente der MySequence-Aktivität.

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 freigeben. Für die übergeordnete Aktivität, in diesem Fall MySequence, besteht eine empfohlene Vorgehensweise darin, auch eine Auflistung von Variablen verfügbar zu machen, durch die die untergeordneten Aktivitäten dies erreichen können. Genau wie untergeordnete Aktivitäten fügt die CacheMetadata-Methode öffentliche Eigenschaften des Typs Variable oder IEnumerable<Variable> als Variablen, die der MySequence-Aktivität zugewiesen sind, 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 der AddImplementationVariable-Methode innerhalb CacheMetadata-Methode der MySequence-Aktivität ein Aufruf hinzugefügt wird. Die Activity-Objekte, die der Activities-Auflistung von MySequence hinzugefügt werden, können nicht auf Variablen zugreifen, die auf diese Weise hinzugefügt wurden.

Wenn MySequence von der Laufzeit ausgeführt wird, ruft die Laufzeit die Execute-Methode auf und übergibt einen NativeActivityContext. Der 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 zum Kapseln der Logik des Planens des ersten untergeordneten Elements sowie aller nachfolgenden untergeordneten Elemente in einer einzigen Methode. Es wird durch Dereferenzieren des currentIndex gestartet. Wenn dieser der Anzahl in der Activities-Auflistung entspricht, wird die Sequenz beendet, die Aktivität gibt einen Wert zurück, ohne Aufgaben zu planen, und er wird von der Laufzeit in den Zustand Closed verschoben. Wenn der currentIndex geringer als die Anzahl von Aktivitäten ist, wird das nächste untergeordnete Element aus der Activities-Auflistung abgerufen, und MySequence ruft ScheduleActivity auf und übergibt das zu planende untergeordnete Element sowie einen CompletionCallback, der auf die InternalExecute-Methode zeigt. Schließlich wird der currentIndex inkrementiert, und die Steuerung wird zurück an die Laufzeit gegeben. Solange eine Instanz von MySequence über ein geplantes untergeordnetes Activity-Objekt verfügt, wird diese von der Laufzeit als im ausgeführten Zustand betrachtet.

Wenn die untergeordnete Aktivität abgeschlossen wird, wird der CompletionCallback ausgeführt. Die Schleife fängt wieder von vorne an. Wie auch Execute, verwendet ein CompletionCallback einen ActivityExecutionContext, sodass die Implementierung Zugriff auf die Laufzeit erhält.

MyWhile unterscheidet sich von MySequence dahingehend, dass es ein einzelnes Activity-Objekt wiederholt plant und einen Activity<booleschen> Wert mit dem Namen Condition verwendet, um zu ermitteln, ob diese Planung stattfinden soll. Wie auch MySequence, verwendet MyWhile eine InternalExecute-Methode, um seine Planungslogik zu zentralisieren. Es plant den Condition Activity<booleschen> Wert mit einem CompletionCallback<booleschen> Wert mit dem Namen 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, MyWhile ScheduleActivity aufruft, werden das Body Activity-Objekt und InternalExecute als CompletionCallback übergeben. Wenn die Ausführung von Body abgeschlossen ist, wird Condition erneut in InternalExecute geplant, und die Starte beginn erneut von vorne. Wenn der Condition false zurückgibt, gibt eine Instanz von MyWhile die Steuerung an die Laufzeit zurück, ohne den Body zu planen, und die Laufzeit verschiebt diesen in den Zustand Closed.

So richten Sie das Beispiel ein, erstellen es und führen es aus

  1. Öffnen Sie die Beispielprojektmappe "Composite.sln" in Visual Studio 2010.

  2. Erstellen Sie die Projektmappe, und führen Sie sie aus.

Dd759031.Important(de-de,VS.100).gif Hinweis:
Die Beispiele sind möglicherweise bereits auf dem Computer installiert. Überprüfen Sie das folgende (standardmäßige) Verzeichnis, bevor Sie fortfahren.

<Installationslaufwerk>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)- und WF-Beispiele herunterzuladen. Dieses Beispiel befindet sich im folgenden Verzeichnis.

<Installationslaufwerk>:\WF_WCF_Samples\WF\Basic\CustomActivities\Code-Bodied\CustomCompositeNativeActivity