Opzioni di creazione di attività in WFActivity Authoring Options in WF

In .NET Framework 4.6.1.NET Framework 4.6.1 sono disponibili numerose opzioni per la creazione di attività personalizzate..NET Framework 4.6.1.NET Framework 4.6.1 provides several options for creating custom activities. Il metodo corretto da usare per la creazione di un'attività specifica dipende dalle funzionalità di runtime richieste.The correct method to use for authoring a given activity depends on what run-time features are required.

Scelta della classe di attività di base da usare per la creazione di attività personalizzateDeciding Which Base Activity Class to Use for Authoring Custom Activities

Nella tabella seguente sono elencate le funzionalità disponibili nelle classi di base di attività personalizzate.The following table lists the features available in the custom activity base classes.

Classe di attività di baseBase activity class Funzionalità disponibiliFeatures available
Activity Compone gruppi di attività fornite dal sistema e personalizzate in un'attività composita.Composes groups of system-provided and custom activities into a composite activity.
CodeActivity Implementa la funzionalità imperativa fornendo un metodo Execute di cui può essere eseguito l'override.Implements imperative functionality by providing an Execute method that can be overridden. Inoltre fornisce l'accesso a rilevamenti, variabili e argomenti.Also provides access to tracking, variables, and arguments..
NativeActivity Fornisce tutte le funzionalità dell'oggetto CodeActivity, oltre all'interruzione dell'esecuzione di attività, all'annullamento dell'esecuzione di attività figlio, all'utilizzo di segnalibri e alla pianificazione di attività, azioni di attività e funzioni.Provides all of the features of CodeActivity, plus aborting activity execution, canceling child activity execution, using bookmarks, and scheduling activities, activity actions, and functions.
DynamicActivity Fornisce un approccio di tipo DOM alla costruzione di attività che si interfacciano con la finestra di progettazione WF e il sistema in fase di esecuzione tramite IcustomTypeDescriptor, consentendo la nuova attività da creare senza definire nuovi tipi.Provides a DOM-like approach to constructing activities that interfaces with the WF designer and the run-time machinery through IcustomTypeDescriptor, allowing new activities to be created without defining new types.

Creazione di attività tramite la classe ActivityAuthoring Activities using Activity

Le attività che derivano dalla classe Activity compongono la funzionalità assemblando altre attività esistenti.Activities that derive from Activity compose functionality by assembling other existing activities. Queste attività possono essere attività personalizzate esistenti e attività dell'apposita libreria di .NET Framework 4.6.1.NET Framework 4.6.1.These activities can be existing custom activities and activities from the .NET Framework 4.6.1.NET Framework 4.6.1 activity library. L'assemblaggio di queste attività è il modo più comunemente usato per creare la funzionalità personalizzata.Assembling these activities is the most basic way to create custom functionality. Questo approccio viene generalmente adottato quando si usa un ambiente di progettazione visiva per la creazione di flussi di lavoro.This approach is most typically taken when using a visual design environment for authoring workflows.

Creazione di attività tramite CodeActivity o AsyncCodeActivityAuthoring Activities using CodeActivity or AsyncCodeActivity

Le attività che derivano dalla classe CodeActivity o AsyncCodeActivity possono implementare la funzionalità imperativa eseguendo l'override del metodo Execute con codice imperativo personalizzato.Activities that derive from CodeActivity or AsyncCodeActivity can implement imperative functionality by overriding the Execute method with custom imperative code. Il codice personalizzato viene eseguito quando l'attività viene eseguita dal runtime.The custom code is executed when the activity is executed by the runtime. Le attività create in questo modo possono accedere alla funzionalità personalizzata, ma non a tutte le funzionalità del runtime, ad esempio non dispongono dell'accesso completo all'ambiente di esecuzione, non dispongono della capacità di pianificare le attività figlio, di creare segnalibri o di supportare un metodo Cancel o Abort.While activities created in this way have access to custom functionality, they do not have access to all of the features of the runtime, such as full access to the execution environment, the ability to schedule child activities, bookmark creation, or support for a Cancel or Abort method. Quando una classe CodeActivity viene eseguita, dispone dell'accesso a una versione ridotta dell'ambiente di esecuzione (tramite la classe CodeActivityContext o AsyncCodeActivityContext).When a CodeActivity executes, it has access to a reduced version of the execution environment (through the CodeActivityContext or AsyncCodeActivityContext class). Le attività create usando la classe CodeActivity dispongono dell'accesso alla risoluzione di argomenti e variabili, alle estensioni e ai rilevamenti.Activities created using CodeActivity have access to argument and variable resolution, extensions, and tracking. La pianificazione di attività asincrone può essere eseguita usando la classe AsyncCodeActivity.Asynchronous activity scheduling can be done using AsyncCodeActivity.

Creazione di attività tramite la classe NativeActivityAuthoring Activities using NativeActivity

Le attività che derivano dalla classe NativeActivity, come quelle che derivano dalla classe CodeActivity creano la funzionalità imperativa eseguendo l'override del metodo Execute, ma dispongono anche dell'accesso a tutta la funzionalità del runtime del flusso di lavoro tramite la classe NativeActivityContext che viene passata al metodo Execute.Activities that derive from NativeActivity, like those that derive from CodeActivity, create imperative functionality by overriding Execute, but also have access to all of the functionality of the workflow runtime through the NativeActivityContext that gets passed into the Execute method. In questo contesto dispone del supporto per la pianificazione e l'annullamento delle attività figlio, eseguendo ActivityAction e ActivityFunc oggetti, propagazione delle transazioni in un flusso di lavoro, richiamando i processi asincroni, annullando e interrompendo l'esecuzione, l'accesso a le proprietà di esecuzione e alle estensioni e ai segnalibri (handle per la ripresa dei flussi di lavoro in pausa).This context has support for scheduling and canceling child activities, executing ActivityAction and ActivityFunc objects, flowing transactions into a workflow, invoking asynchronous processes, canceling and aborting execution, access to execution properties and extensions, and bookmarks (handles for resuming paused workflows).

Creazione di attività tramite la classe DynamicActivityAuthoring Activities using DynamicActivity

A differenza degli altri tre tipi di attività, non viene creata una nuova funzionalità derivando nuovi tipi dalla classe DynamicActivity (la classe è sealed), bensì assemblando la funzionalità nelle proprietà Properties e Implementation tramite un modello a oggetti documento (DOM) dell'attività.Unlike the other three types of activity, new functionality is not created by deriving new types from DynamicActivity (the class is sealed), but instead, by assembling functionality into the Properties and Implementation properties using an activity document object model (DOM).

Creazione di attività che restituiscono un risultatoAuthoring Activities that Return a Result

Molte attività devono restituire un risultato dopo la relativa esecuzione.Many activities must return a result after their execution. Anche se a tal fine è sempre possibile definire un oggetto OutArgument<T> personalizzato in un'attività, è consigliabile usare invece l'oggetto Activity<TResult> o derivare dall'oggetto CodeActivity<TResult> o NativeActivity<TResult>.Although it is possible to always define a custom OutArgument<T> on an activity for this purpose, it is suggested to instead use Activity<TResult>, or derive from CodeActivity<TResult> or NativeActivity<TResult>. Ognuna di queste classi di base dispone di un oggetto OutArgument<T> denominato Result che l'attività può usare per il relativo valore restituito.Each of these base classes has an OutArgument<T> named Result that your activity can use for its return value. Le attività che restituiscono un risultato devono essere usate solo se solo un risultato deve essere restituito da un'attività. Se devono essere restituiti più risultati, è necessario usare i membri OutArgument<T> separati.Activities that return a result should only be used if only one result needs to be returned from an activity; if multiple results need to be returned, separate OutArgument<T> members should be used instead.