Compartir a través de


Creación de actividades de control de flujo personalizadas

.NET Framework contiene una variedad de actividades de control de flujo que funcionan de forma similar a estructuras de programación abstractas (como Flowchart) o a instrucciones de programación estándar (como If). En este tema se describe la arquitectura de uno de los proyectos de ejemplo , ForEach no genérico.

Creación de la clase personalizada

Dado que la clase ForEach no genérica tendrá que programar actividades secundarias, tendrá que derivar de NativeActivity, ya que las actividades que derivan de CodeActivity no tienen esta funcionalidad.

public sealed class ForEach : NativeActivity  
{
}

La clase personalizada requiere que varios miembros almacenen datos que van a ser utilizados por la actividad y proporcionen funcionalidad para ejecutar las actividades secundarias de la actividad. Estos miembros incluyen:

  • valueEnumerator: clase Variable<T> no pública de tipo IEnumerator que se utiliza para realizar iteraciones en la colección de elementos. Este miembro es de tipo Variable<T> porque se usa internamente en la actividad, en lugar de un argumento o propiedad pública, que se usaría si este objeto tuviera un origen fuera de la actividad.

  • OnChildComplete: propiedad CompletionCallback pública que se ejecuta cuando se completa la ejecución de cada actividad secundaria. Este miembro se define como una propiedad CLR, ya que su valor no cambiará para instancias diferentes de la actividad.

  • Values: colección de entradas que se utilizan para las iteraciones de la actividad secundaria. Este miembro es de tipo InArgument<T>, ya que el origen de los datos está fuera de la actividad, pero no se espera que el contenido de la colección cambie durante la ejecución de la actividad. Si la actividad necesitaba la funcionalidad para cambiar el contenido de esta colección mientras se estaba ejecutando la actividad (para agregar o quitar actividades, por ejemplo), este miembro se habría definido como , ActivityActionque después se habría evaluado cada vez que se accedió a ella, de modo que los cambios estarían disponibles para la actividad.

  • Body: este miembro define la actividad que se va a ejecutar para cada elemento de la Values colección. Este miembro se define como un ActivityAction para que se evalúe cada vez que se accede a él.

  • Execute: este método utiliza los miembros no públicos InternalExecute, OnForEachComplete y GetStateAndExecute para programar la ejecución y asignar el controlador de finalización de la actividad secundaria definida en el miembro Body.

  • CacheMetadata: este miembro proporciona al runtime la información que necesita para ejecutar la actividad. De forma predeterminada, el método de CacheMetadata una actividad informará al tiempo de ejecución de todos los miembros públicos de la actividad, pero dado que esta actividad usa miembros privados para alguna funcionalidad, debe informar al tiempo de ejecución de su existencia para que el tiempo de ejecución pueda ser consciente de ellos. En este caso, la CacheMetadata función se invalida para que se pueda acceder al miembro privado valueEnumerator . Este miembro también crea un argumento para los valores de la actividad de modo que se puedan pasar a la actividad durante la ejecución.