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.
.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 Values propiedad sea de tipo IEnumerable<T>. Esto impide que los usuarios iteren sobre 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 en 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 no genérica ParallelForEach<T> y su diseñador. Esta actividad se puede utilizar para recorrer en iteración ArrayList.
Actividad ParallelForEach
La instrucción C#/Visual Basic foreach
enumera los elementos de una colección, ejecutando una instrucción insertada para cada elemento de la colección. Las actividades equivalentes de WF son ForEach<T> y ParallelForEach<T>. La ForEach<T> actividad contiene una lista de valores y un contenido. 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
. El 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, ya que abarca la mayoría de los escenarios en los que se usa y proporciona la comprobación de tipos en tiempo de compilación. La versión no genérica se puede usar para recorrer en iteración los tipos que implementan la interfaz no genérica IEnumerable .
Definición de clase
En el ejemplo de código siguiente se muestra la definición de una actividad no genérica ParallelForEach
.
[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.
Condición de finalización (opcional)
La CompletionCondition propiedad se evalúa después de que se complete cualquier iteración. Si se evalúa como true
, se cancelan las iteraciones pendientes programadas. Si esta propiedad no está establecida, todas las actividades de la colección Branches se ejecutan hasta su finalización.
Ejemplo de uso de ParallelForEach
En el código siguiente se muestra cómo usar 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 ParallelForEach
El diseñador de actividad del ejemplo es similar en apariencia al diseñador proporcionado para la actividad integrada ParallelForEach<T> . El diseñador aparece en el cuadro de herramientas de 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
Establezca el proyecto que prefiera como proyecto de inicio de la solución.
CodeTestClient muestra cómo usar la actividad mediante código.
DesignerTestClient muestra cómo usar la actividad dentro del diseñador.
Compile y ejecute el proyecto.