Attività composta personalizzata tramite l'oggetto NativeActivityCustom Composite using Native Activity

In questo esempio viene illustrato come scrivere un oggetto NativeActivity che pianifica altri oggetti Activity per controllare il flusso dell'esecuzione di un flusso di lavoro.This sample demonstrates how to write a NativeActivity that schedules other Activity objects to control the flow of a workflow’s execution. In questo esempio vengono usati due flussi di controllo comuni, Sequence e While, per illustrate le operazioni da eseguire.This sample uses two common control flows, Sequence and While, to demonstrate how to do this.

Dettagli dell'esempioSample Details

Iniziando da MySequence, la prima cosa da notare è che deriva da NativeActivity.Starting with MySequence, the first thing to notice is that it derives from NativeActivity. NativeActivity è l'oggetto Activity che espone l'intero runtime del flusso di lavoro attraverso l'oggetto NativeActivityContext passato al metodo Execute.NativeActivity is the Activity object that exposes the full breadth of the workflow runtime through the NativeActivityContext passed to the Execute method.

L'oggetto MySequence espone una raccolta pubblica di oggetti Activity che viene popolata dall'autore del flusso di lavoro.MySequence exposes a public collection of Activity objects that gets populated by the workflow author. Prima dell'esecuzione del flusso di lavoro, il relativo runtime chiama il metodo CacheMetadata in ogni attività di un flusso di lavoro.Before the workflow is executed, the workflow runtime calls the CacheMetadata method on each activity in a workflow. Durante questo processo, il runtime stabilisce relazioni padre-figlio per l'ambito dei dati e la gestione di durata.During this process, the runtime establishes parent-child relationships for data scoping and lifetime management. L'implementazione predefinita del CacheMetadata metodo utilizza il TypeDescriptor l'istanza di classe per il MySequence attività per l'aggiunta di qualsiasi proprietà pubblica di tipo Activity o IEnumerable < Activity> come elementi figlio del MySequence attività.The default implementation of the CacheMetadata method uses the TypeDescriptor instance class for the MySequence activity to add any public property of type Activity or IEnumerable<Activity> as children of the MySequence activity.

Ogni volta che un'attività espone una raccolta pubblica di attività figlio, è probabile che queste ultime condividano lo stato.Whenever an activity exposes a public collection of child activities, it is likely those child activities share state. Una procedura consigliata per l'attività padre, in questo caso MySequence, consiste nell'esporre anche una raccolta di variabili tramite cui le attività figlio possono portare a termine questa operazione.It is a best practice for the parent activity, in this case MySequence, to also expose a collection of variables through which the child activities can accomplish this. Come attività figlio, il CacheMetadata metodo aggiunge proprietà pubbliche di tipo Variable o IEnumerable < Variable> come variabili associate con il MySequence attività.Like child activities, the CacheMetadata method adds public properties of type Variable or IEnumerable<Variable> as variables associated with the MySequence activity.

Oltre alle variabili pubbliche, che vengono modificati gli elementi figlio del MySequence, MySequence deve anche tenere traccia di in cui è in esecuzione dei relativi elementi figlio.Besides the public variables, which are manipulated by the children of MySequence, MySequence must also keep track of where it is in the execution of its children. Per eseguire questa operazione, usa una variabile privata, ovvero currentIndex.It uses a private variable, currentIndex, to accomplish this. Questa variabile viene registrata come parte dell'ambiente MySequence aggiungendo una chiamata al metodo AddImplementationVariable all'interno del metodo MySequence dell'attività CacheMetadata.This variable is registered as part of the MySequence environment by adding a call to the AddImplementationVariable method within the MySequence activity’s CacheMetadata method. Gli oggetti Activity aggiunti alla raccolta MySequence``Activities non possono accedere alle variabili aggiunte in questo modo.The Activity objects added to the MySequence Activities collection cannot access variables added this way.

Quando l'oggetto MySequence viene eseguito dal runtime, quest'ultimo chiama il metodo Execute, passando un oggetto NativeActivityContext.When MySequence is executed by the runtime, the runtime calls its Execute method, passing in an NativeActivityContext. L'oggetto NativeActivityContext è il proxy dell'attività di nuovo nel runtime per dereferenziare gli argomenti e le variabili nonché pianificare altri oggetti Activity o ActivityDelegates.The NativeActivityContext is the activity’s proxy back into the runtime for dereferencing arguments and variables as well as scheduling other Activity objects, or ActivityDelegates. MySequence usa un metodo InternalExecute per incapsulare la logica di pianificazione del primo elemento figlio e di tutti gli elementi figlio successivi in un singolo metodo.MySequence uses an InternalExecute method to encapsulate the logic of scheduling the first child and all subsequent children in a single method. Inizia dereferenziando il riferimento currentIndex.It starts by dereferencing the currentIndex. Se è uguale al conteggio nella raccolta Activities, la sequenza è completata, l'attività viene restituita senza pianificare nessuna operazione e lo stato del runtime viene impostato su Closed.If it is equal to the count in the Activities collection, then the sequence is finished, the activity returns without scheduling any work and the runtime moves it into the Closed state. Se il currentIndex è minore rispetto al numero di attività, l'elemento figlio successivo viene ottenuto dal Activities insieme e MySequence chiamate ScheduleActivity, passando l'elemento figlio da pianificare e un CompletionCallback che punta al InternalExecute metodo.If the currentIndex is less than the count of activities, the next child is obtained from the Activities collection and MySequence calls ScheduleActivity, passing in the child to be scheduled and a CompletionCallback that points at the InternalExecute method. Infine, viene incrementato l'oggetto currentIndex e il controllo viene di nuovo restituito al runtime.Finally, the currentIndex is incremented and control is yielded back to the runtime. Finché un'istanza dell'oggetto MySequence dispone di un oggetto Activity figlio pianificato, il runtime considera che si trovi nello stato Executing.As long as an instance of MySequence has a child Activity object scheduled, the runtime considers it to be in the Executing state.

Una volta completata l'attività figlio, viene eseguito l'oggetto CompletionCallback.When the child activity completes, the CompletionCallback is executed. Il ciclo continua dall'inizio.The loop continues from the top. Come per Execute, un oggetto CompletionCallback accetta un oggetto NativeActivityContext, consentendo al responsabile dell'implementazione di accedere al runtime.Like Execute, a CompletionCallback takes an NativeActivityContext, giving the implementer access to the runtime.

MyWhile è diverso da MySequence in quanto consente di pianificare un singolo Activity oggetto ripetutamente e in che usa un Activity<TResult>< bool> denominato Condition per determinare se deve verificarsi questa pianificazione.MyWhile differs from MySequence in that it schedules a single Activity object repeatedly, and in that it uses a Activity<TResult><bool> named Condition to determine whether this scheduling should occur. Come per MySequence, l'oggetto MyWhile usa un metodo InternalExecute per centralizzare la relativa logica di pianificazione.Like MySequence, MyWhile uses an InternalExecute method to centralize its scheduling logic. Consente di pianificare il Condition Activity< bool> con un CompletionCallback<TResult> <bool > denominato OnEvaluationCompleted.It schedules the ConditionActivity<bool> with a CompletionCallback<TResult><bool> named OnEvaluationCompleted. Quando viene completata l'esecuzione dell'oggetto Condition, il risultato diventa disponibile tramite questo oggetto CompletionCallback in un parametro fortemente tipizzato denominato result.When the execution of Condition is completed, its result becomes available through this CompletionCallback in a strongly-typed parameter named result. Se true, l'oggetto MyWhile chiama il metodo ScheduleActivity, passando gli oggetti BodyActivity e InternalExecute come oggetto CompletionCallback.If true, MyWhile calls ScheduleActivity, passing in the BodyActivity object and InternalExecute as the CompletionCallback. Quando viene completata l'esecuzione dell'oggetto Body, l'oggetto Condition viene nuovamente pianificato in InternalExecute, avviando di nuovo il ciclo.When the execution of Body completes, Condition gets scheduled again in InternalExecute, starting the loop over again. Quando l'oggetto Condition restituisce false, un'istanza dell'oggetto MyWhile restituisce il controllo al runtime senza pianificare l'oggetto Body e il runtime ne imposta lo stato su Closed.When the Condition returns false, an instance of MyWhile gives control back to the runtime without scheduling the Body and the runtime moves it to the Closed state.

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Aprire la soluzione di esempio Composite.sln in Visual Studio 2010Visual Studio 2010.Open the Composite.sln sample solution in Visual Studio 2010Visual Studio 2010.

  2. Compilare ed eseguire la soluzione.Build and run the solution.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

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