Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este tema es aplicable a Windows Workflow Foundation 4.
En este ejemplo se muestra cómo escribir un objeto NativeActivity que programa otros objetos Activity para controlar el flujo de ejecución de un flujo de trabajo. En este ejemplo se utilizan dos flujos de control comunes, Sequence y While, para mostrar cómo hacerlo.
Detalles del ejemplo
Comenzando con MySequence
, lo primero que se debe observar es que se deriva de NativeActivity. NativeActivity es el objeto Activity que expone el ámbito completo de ActivityRuntime a través del objeto NativeActivityContext pasado al método Execute
.
MySequence
expone una colección pública de objetos Activity que rellena el autor del flujo de trabajo. Antes de que se ejecute el flujo de trabajo, el tiempo de ejecución del flujo de trabajo llama al método CacheMetadata en cada actividad de un flujo de trabajo. Durante este proceso, el tiempo de ejecución establece relaciones primarias-secundarias para administrar la duración y el ámbito de los datos. La implementación predeterminada del método CacheMetadata utiliza la clase de instancia TypeDescriptor de la actividad MySequence
para agregar las propiedades públicas de tipo Activity o IEnumerable<Activity> como elementos secundarios de la actividad MySequence
.
Siempre que una actividad expone una colección pública de actividades secundarias, es bastante probable que esas actividades secundarias compartan estado. Es un procedimiento recomendado para la actividad primaria, en este caso MySequence
, exponer también una colección de variables que permitan a las actividades secundarias lograrlo. Al igual que las actividades secundarias, el método CacheMetadata agrega propiedades públicas de tipo Variable o IEnumerable<Variable> como variables asociadas a la actividad MySequence
.
Además de las variables públicas, que son manipuladas por los elementos secundarios de MySequence
, MySequence
debe realizar también un seguimiento de en qué punto se encuentra en la ejecución de sus elementos secundarios. Para ello, utiliza una variable privada, currentIndex
. Esta variable se registra como parte del entorno MySequence
agregando una llamada al método AddImplementationVariable dentro del método CacheMetadata de la actividad MySequence
. Los objetos Activity agregados a la colección MySequence ``Activities
no pueden obtener acceso a las variables agregadas de esta manera.
Cuando el tiempo de ejecución ejecuta MySequence
, llama a su método Execute, pasando un objeto NativeActivityContext. NativeActivityContext representa el proxy de la actividad en tiempo de ejecución para desreferenciar los argumentos y las variables, así como para programar otros objetos Activity o ActivityDelegates
. MySequence
utiliza un método InternalExecute
para encapsular la lógica de programación del primer elemento secundario y todos los elementos secundarios subsiguientes en un método único. Se inicia desreferenciando el objeto currentIndex
. Si es igual al recuento de la colección Activities
, se finaliza la secuencia, la actividad devuelve sin programar cualquier trabajo y el tiempo de ejecución pasa al estado Closed. Si currentIndex
es menor que el recuento de actividades, el elemento secundario siguiente se obtiene de la colección Activities
y MySequence
llama a ScheduleActivity, pasando el elemento secundario que se va a programar y CompletionCallback que señala al método InternalExecute
. Por último, currentIndex
se incrementa y el control se devuelve al tiempo de ejecución. Mientras una instancia de MySequence
tenga un objeto secundario Activity programado, el motor de ejecución considerará que su estado es En ejecución.
Cuando la actividad secundaria se completa, se ejecuta CompletionCallback. El bucle continúa desde el principio. Al igual que Execute
, CompletionCallback toma un objeto ActivityExecutionContext, otorgando al implementador acceso al tiempo de ejecución.
MyWhile
difiere de MySequence
en que programa un objeto Activity único de forma repetida y en que utiliza un objeto Activity<bool> denominado Condition
para determinar si se debería producir la programación. Al igual que MySequence
, MyWhile
utiliza un método InternalExecute
para centralizar su lógica de programación. Programa el objeto Condition
Activity<bool> con un CompletionCallback<bool> denominado OnEvaluationCompleted
. Cuando se completa la ejecución de Condition
, su resultado pasa a estar disponible a través de CompletionCallback en un parámetro fuertemente tipado denominado result
. If true
, MyWhile
llama a ScheduleActivity, pasando el objeto Body
Activity y InternalExecute
como CompletionCallback. Cuando la ejecución de Body
se completa, Condition
se vuelve a programar en InternalExecute
, lo que inicia de nuevo el bucle. Cuando Condition
devuelve false, una instancia de MyWhile
devuelve el control al tiempo de ejecución sin programar el objeto Body
y el tiempo de ejecución pasa al estado Closed.
Para configurar, compilar y ejecutar el ejemplo
Abra la solución de prueba Composite.sln en Visual Studio 2010.
Compile y ejecute la solución.
![]() |
---|
Puede que los ejemplos ya estén instalados en su equipo. Compruebe el siguiente directorio (valor predeterminado) antes de continuar.
<InstallDrive>:\WF_WCF_Samples
Si no existe este directorio, vaya a la página de ejemplos de Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) Samples para .NET Framework 4 para descargar todos los ejemplos de Windows Communication Foundation (WCF) y WF. Este ejemplo se encuentra en el siguiente directorio.
<InstallDrive>:\WF_WCF_Samples\WF\Basic\CustomActivities\Code-Bodied\CustomCompositeNativeActivity
|