ParallelForEach no genérico

.NET Framework 4.6.1 incluye en su cuadro de herramientas un conjunto de actividades del flujo de control, como la actividad ParallelForEach<T>, que permite recorrer en iteración colecciones IEnumerable<T>.

ParallelForEach<T> requiere que su propiedad Values sea del tipo IEnumerable<T>. Esto impide a los usuarios recorrer en iteración estructuras de datos que implementan la interfaz IEnumerable<T> (por ejemplo, ArrayList). La versión no genérica de ParallelForEach<T> supera este requisito, a costa de una mayor complejidad del tiempo de ejecución para garantizar la compatibilidad de los tipos de los valores de la colección.

En el ejemplo NonGenericParallelForEach se muestra cómo implementar una actividad ParallelForEach<T> no genérica y su diseñador. Esta actividad se puede utilizar para recorrer en iteración ArrayList.

Actividad ParallelForEach

La instrucción foreach de C# y Visual Basic enumera los elementos de una colección y ejecuta una instrucción incrustada para cada elemento de la colección. Las actividades equivalentes son ForEach<T> y ParallelForEach<T>. La actividad ForEach<T> contiene una lista de valores y un cuerpo. En el tiempo de ejecución, la lista se recorre en iteración y se ejecuta el cuerpo para cada valor de la lista.

ParallelForEach<T> tiene una condición CompletionCondition, para que la actividad ParallelForEach<T> se pueda completar antes si la evaluación de la condición CompletionCondition devuelve true. La propiedad CompletionCondition se evalúa después de completar cada iteración.

En la mayoría de los casos, la versión genérica de la actividad debe ser la solución preferida, porque abarca la mayoría de los escenarios en los que se utiliza y proporciona comprobación de tipos en tiempo de compilación. La versión no genérica se puede utilizar para recorrer en iteración tipos que implementan la interfaz IEnumerable no genérica.

Definición de clase

El siguiente ejemplo de código muestra la definición de una actividad ParallelForEach no genérica.

[ContentProperty("Body")]
public class ParallelForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    public Activity<bool> CompletionCondition
    [DefaultValue(null)]
    [DependsOn("CompletionCondition")]
    ActivityAction<object> Body { get; set; }
}

Cuerpo (opcional)
ActivityAction de tipo Object, que se ejecuta para cada elemento en la colección. Cada elemento individual se pasa al cuerpo a través de su propiedad Argument.

Valores (opcional)
La colección de elementos que se recorre en iteración. La verificación de que todos los elementos de la colección son de tipos compatibles se realiza en el tiempo de ejecución.

CompletionCondition (opcional)
La propiedad CompletionCondition se evalúa después de completarse cada iteración. Si se evalúa como true, se cancelan las iteraciones programadas pendientes. Si esta propiedad no está establecida, todas las actividades de la colección Branches se ejecutan hasta su finalización.

Ejemplo de utilización de ParallelForEach

El siguiente código muestra cómo utilizar la actividad ParallelForEach en una aplicación.

string[] names = { "bill", "steve", "ray" };

DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };

Activity sampleUsage =
    new ParallelForEach
    {
       Values = new InArgument<IEnumerable>(c=> names),
       Body = new ActivityAction<object>
       {
           Argument = iterationVariable,
           Handler = new WriteLine
           {
               Text = new InArgument<string>(env => string.Format("Hello {0}",                                                               iterationVariable.Get(env)))
           }
       }
   };

Diseñador de ParallelForEach

El diseñador de actividad del ejemplo es similar en aspecto al diseñador proporcionado para la actividad ParallelForEach<T> integrada. El diseñador aparece en el cuadro de herramientas en la categoría Ejemplos, Actividades no genéricas. El diseñador se denomina ParallelForEachWithBodyFactory en el cuadro de herramientas, porque la actividad expone un objeto IActivityTemplateFactory en el cuadro de herramientas que crea la actividad con un objeto ActivityAction configurado correctamente.

public sealed class ParallelForEachWithBodyFactory : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Microsoft.Samples.Activities.Statements.ParallelForEach()
        {
            Body = new ActivityAction<object>()
            {
                Argument = new DelegateInArgument<object>()
                {
                    Name = "item"
                }
            }
        };
    }
}

Para ejecutar el ejemplo

  1. Establezca el proyecto que desee como el proyecto de inicio de la solución.

    1. CodeTestClient muestra cómo utilizar la actividad mediante código.

    2. DesignerTestClient muestra cómo utilizar la actividad en el diseñador.

  2. Compile y ejecute el proyecto.