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.
.NET Framework versión 4 incluye en su cuadro de herramientas un conjunto de actividades Control Flow, como la actividad ParallelForEach, que permite recorrer en iteración colecciones IEnumerable.
ParallelForEach requiere que su propiedad Values sea del tipo IEnumerable. Esto impide a los usuarios recorrer en iteración estructuras de datos que implementan la interfaz IEnumerable (por ejemplo, ArrayList). La versión no genérica de ParallelForEach 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 este ejemplo se muestra cómo implementar una actividad ParallelForEach 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#/VB enumera los elementos de una colección y ejecuta una instrucción incrustada para cada elemento de la colección. Las actividades equivalentes de WF son ForEach y ParallelForEach. La actividad ForEach 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 tiene una condición CompletionCondition, para que la actividad ParallelForEach 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 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
Establezca el proyecto que desee como el proyecto de inicio de la solución.
CodeTestClient muestra cómo utilizar la actividad mediante código.
DesignerTestClient muestra cómo utilizar la actividad dentro del diseñador.
Compile y ejecute el proyecto.
![]() |
---|
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 WF y Windows Communication Foundation (WCF). Este ejemplo se encuentra en el siguiente directorio.
<InstallDrive>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericParallelForEach
|