Attività ParallelForEach non generica

Nella casella degli strumenti di .NET Framework 4.6.1 è disponibile un set di attività del flusso di controllo, inclusa ParallelForEach<T> che consente di scorrere le raccolte IEnumerable<T>.

L'oggetto ParallelForEach<T> richiede che la relativa proprietà Values sia di tipo IEnumerable<T>. In questo modo, gli utenti non possono scorrere le strutture di dati che implementano l'interfaccia IEnumerable<T> (ad esempio l'oggetto ArrayList). La versione non generica dell'oggetto ParallelForEach<T> supera questo requisito, a discapito di una maggiore complessità della fase di esecuzione per assicurare la compatibilità dei tipi dei valori nella raccolta.

L'esempio NonGenericParallelForEach illustra come implementare un'attività ParallelForEach<T> non generica e la relativa finestra di progettazione. Questa attività può essere usata per scorrere l'oggetto ArrayList.

Attività ParallelForEach

L'istruzione foreach di C#/Visual Basic enumera gli elementi di una raccolta eseguendo un'istruzione incorporata per ogni elemento della raccolta. Le attività equivalenti di Windows Workflow Foundation sono ForEach<T> e ParallelForEach<T>. L'attività ForEach<T> contiene un elenco di valori e un corpo. In fase di esecuzione, viene eseguita l'iterazione dell'elenco e il corpo viene eseguito per ogni valore dell'elenco.

L'oggetto ParallelForEach<T> dispone di una proprietà CompletionCondition in modo che l'attività ParallelForEach<T> possa essere completata in fretta se la valutazione della proprietà CompletionCondition restituisce true. La proprietà CompletionCondition viene valutata al termine di ogni iterazione.

Nella maggior parte dei casi, la versione generica dell'attività deve essere la soluzione preferita, poiché concerne la maggioranza degli scenari in cui viene usata e fornisce il controllo dei tipi in fase di compilazione. La versione non generica può essere usata per scorrere i tipi che implementano l'interfaccia IEnumerable non generica.

Definizione della classe

Nell'esempio di codice seguente viene illustrata la definizione di un'attività ParallelForEach non generica.

[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; }
}

Body (facoltativo)
Oggetto ActivityAction di tipo Object eseguito per ogni elemento della raccolta. Ogni singolo elemento viene passato al corpo tramite la proprietà Argument.

Values (facoltativo)
Raccolta di elementi che vengono scorsi. In fase di esecuzione si verifica che tutti gli elementi della raccolta siano di tipi compatibili.

CompletionCondition (facoltativo)
La proprietà CompletionCondition viene valutata al termine di qualsiasi iterazione. Se restituisce true, le iterazioni in sospeso pianificate vengono annullate. Se questa proprietà non è impostata, tutte le attività nella raccolta di rami vengono eseguite fino al completamento.

Esempio di utilizzo di ParallelForEach

Nel codice seguente viene illustrato come usare l'attività ParallelForEach in un'applicazione.

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)))
           }
       }
   };

Finestra di progettazione ParallelForEach

L'aspetto dell'ActivityDesigner per l'esempio è simile a quello della finestra di progettazione fornita per l'attività ParallelForEach<T> incorporata. La finestra di progettazione viene visualizzata nella categoria Esempi, Attività non generiche della casella degli strumenti. La finestra di progettazione è denominata ParallelForEachWithBodyFactory nella casella degli strumenti, poiché l'attività espone un oggetto IActivityTemplateFactory nella casella degli strumenti che crea l'attività con un oggetto ActivityAction correttamente configurato.

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"
                }
            }
        };
    }
}

Per eseguire l'esempio

  1. Impostare il progetto scelto come progetto di avvio della soluzione.

    1. CodeTestClient illustra come usare l'attività tramite codice.

    2. DesignerTestClient illustra come usare l'attività all'interno della finestra di progettazione.

  2. Compilare ed eseguire il progetto.