Condividi tramite


ParallelForEach non generico

.NET Framework 4.6.1 include nella sua casella degli strumenti un set di attività di flusso di controllo, che consente di scorrere le raccolte ParallelForEach<T>, incluso IEnumerable<T>.

ParallelForEach<T> richiede che la proprietà Values sia di tipo IEnumerable<T>. Ciò impedisce agli utenti di eseguire l'iterazione sulle strutture di dati che implementano l'interfaccia IEnumerable<T> , ad esempio ArrayList. La versione non generica di ParallelForEach<T> supera questo requisito, a scapito di una maggiore complessità di runtime per garantire la compatibilità dei tipi dei valori nella raccolta.

L'esempio NonGenericParallelForEach illustra come implementare un'attività non generica ParallelForEach<T> e il relativo designer del progetto. Questa attività può essere usata per scorrere ArrayList.

Attività ParallelForEach

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

ParallelForEach<T> dispone di un CompletionCondition, in modo che l'attività ParallelForEach<T> possa essere completata in anticipo se la valutazione di CompletionCondition restituisce true. L'oggetto CompletionCondition viene valutato dopo il completamento di ogni iterazione.

Per la maggior parte dei casi, la versione generica dell'attività deve essere la soluzione preferita, perché copre la maggior parte 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 non generica IEnumerable .

Definizione della classe

Nell'esempio di codice seguente viene illustrata la definizione di un'attività non generica 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; }
}

Corpo (facoltativo)
L'oggetto ActivityAction di tipo Object esegue un'azione per ogni elemento della raccolta. Ogni singolo elemento viene passato al corpo tramite la relativa proprietà Argument.

Valori (facoltativo)
Raccolta di elementi su cui viene iterazione. Verificare che tutti gli elementi della raccolta siano di tipi compatibili vengano eseguiti in fase di esecuzione.

CondizioneDiCompletamento (facoltativo)
La CompletionCondition proprietà viene valutata dopo il completamento di qualsiasi iterazione. Se restituisce true, le iterazioni pianificate in sospeso vengono annullate. Se questa proprietà non è impostata, tutte le attività della collezione Branches vengono eseguite fino al completamento.

Esempio di uso di ParallelForEach

Il codice seguente illustra 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)))
           }
       }
   };

Progettazione ParallelForEach

L'ActivityDesigner dell'esempio è simile nell'aspetto a quello fornito per l'attività predefinita ParallelForEach<T>. Il designer appare nella casella degli strumenti nella categoria Esempi, Attività non generiche. La finestra di progettazione è denominata ParallelForEachWithBodyFactory nella casella degli strumenti, perché l'attività espone un IActivityTemplateFactory oggetto nella casella degli strumenti che crea l'attività con un oggetto configurato ActivityActioncorrettamente.

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 preferito come progetto di avvio della soluzione.

    1. CodeTestClient mostra come usare l'attività usando il codice.

    2. DesignerTestClient mostra come utilizzare l'attività nel designer.

  2. Compilare ed eseguire il progetto.