Creazione di attività di controllo del flusso personalizzateCreating custom flow control activities

.NET Framework contiene una gamma di attività di controllo del flusso che funzionano in modo analogo alle strutture di programmazione astratte (come Flowchart) o alle istruzioni di programmazione standard (come If).The .Net Framework contains a variety of flow-control activities that function similarly to abstract programming structures (such as Flowchart) or to standard programming statements (such as If). In questo argomento viene illustrata l'architettura di uno dei progetti di esempio, Non-Generic ForEach.This topic discusses the architecture of one of the sample projects, Non-Generic ForEach.

Creazione della classe personalizzataCreating the custom class

Poiché la classe Non-Generic ForEach dovrà pianificare le attività figlio, dovrà effettuare la derivazione da NativeActivity, dal momento che le attività che derivano da CodeActivity non dispongono di questa funzionalità.Since the Non-Generic ForEach class will need to schedule child activities, it will need to derive from NativeActivity, since activities that derive from CodeActivity do not have this functionality.

public sealed class ForEach : NativeActivity  
    {  

La classe personalizzata richiede diversi membri per archiviare i dati usati dall'attività e fornire la funzionalità per eseguire le attività figlio dell'attività.The custom class requires several members to store data being used by the activity, and to provide functionality to execute the activity’s child activities. Tali membri includono:These members include:

  • valueEnumerator: oggetto Variable<T> non pubblico di tipo IEnumerator usato per scorrere la raccolta di elementi.valueEnumerator: The non-public Variable<T> of type IEnumerator used to iterate over the collection of items. Questo membro è di tipo Variable<T> perché usato internamente all'attività, piuttosto che essere un argomento o una proprietà pubblica, che verrebbero usati se questo oggetto avesse un'origine esterna all'attività.This member is of type Variable<T> because it is used internally in the activity, rather than an argument or public property, which would be used if this object were to have an origin outside the activity.

  • OnChildComplete: proprietà CompletionCallback pubblica che viene eseguita quando ogni figlio completa l'esecuzione.OnChildComplete: The public CompletionCallback property that executes when each child completes execution. Questo membro è definito come una proprietà CLR, poiché il relativo valore non varia per istanze diverse dell'attività.This member is defined as a CLR property, since its value will not change for different instances of the activity.

  • Values: raccolta di input usata per le iterazioni dell'attività figlio.Values: The collection of inputs used for the iterations of the child activity. Questo membro è di tipo InArgument<T>, poiché l'origine dei dati è esterna all'attività, ma non si prevedono modifiche del contenuto della raccolta durante l'esecuzione dell'attività.This member is of type InArgument<T>, since the origin of the data is outside the activity, but the contents of the collection is not expected to change during the execution of the activity. Se, nel corso dell'esecuzione, l'attività avesse avuto bisogno che la funzionalità modificasse il contenuto di questa raccolta (per aggiungere o rimuovere attività, ad esempio), questo membro sarebbe stato definito come ActivityAction, oggetto che sarebbe poi stato valutato a ogni accesso, in modo da rendere le modifiche disponibili all'attività.If the activity needed the functionality to change the contents of this collection while the activity was executing (to add or remove activities, for instance), this member would have been defined as an ActivityAction, which then would have been evaluated every time it was accessed, so that changes would be available to the activity.

  • Body: questo membro definisce l'attività da eseguire per ogni elemento nella raccolta Values.Body: This member defines the activity to be executed for each item in the Values collection. Questo membro viene definito come ActivityAction in modo da essere valutato a ogni accesso.This member is defined as an ActivityAction so that it is evaluated every time it is accessed.

  • Execute: questo metodo usa i membri non pubblici InternalExecute, OnForEachComplete e GetStateAndExecute per pianificare l'esecuzione e assegnare il gestore di completamento dell'attività figlio definita nel membro Body.Execute: This method uses the InternalExecute, OnForEachComplete, and GetStateAndExecute non-public members to schedule the execution and assign the completion handler of the child activity defined in the Body member.

  • CacheMetadata: questo membro fornisce al runtime le informazioni necessarie per eseguire l'attività.CacheMetadata: This member provides the runtime with the information it needs to execute the activity. Per impostazione predefinita, il metodo CacheMetadata di un'attività informa il runtime di tutti i membri pubblici dell'attività, ma poiché questa attività usa membri privati per alcune funzionalità, deve informare il runtime della loro esistenza perché ne tenga conto.By default, an activity’s CacheMetadata method will inform the runtime of all public members of the activity, but since this activity uses private members for some functionality, it needs to inform the runtime of their existence so that the runtime can be aware of them. In questo caso, viene eseguito l'override della funzione CacheMetadata in modo che sia possibile accedere al membro valueEnumerator privato.In this case, the CacheMetadata function is overridden so that the private valueEnumerator member can be accessed. Questo membro crea inoltre un argomento per i valori dell'attività in modo che possano essere passati nell'attività durante l'esecuzione.This member also creates an argument for the values for the activity so that they can be passed in to the activity during execution.