次の方法で共有


非ジェネリック ParallelForEach

.NET Framework 4.6.1 には、 ParallelForEach<T>を含む一連の制御フロー アクティビティがツールボックスに付属しています。これにより、 IEnumerable<T> コレクションを反復処理できます。

ParallelForEach<T> には、その Values プロパティが IEnumerable<T>型である必要があります。 これにより、ユーザーは、 IEnumerable<T> インターフェイス (たとえば、 ArrayList) を実装するデータ構造を反復処理できなくなります。 ParallelForEach<T>の非ジェネリック バージョンは、コレクション内の値の型の互換性を確保するための実行時の複雑さを犠牲にして、この要件を克服します。

NonGenericParallelForEach サンプルは、非ジェネリック ParallelForEach<T> アクティビティとそのデザイナーを実装する方法を示しています。 このアクティビティは、 ArrayListを反復処理するために使用できます。

ParallelForEach アクティビティ

C#/Visual Basic foreach ステートメントはコレクションの要素を列挙し、コレクションの各要素に対して埋め込みステートメントを実行します。 WF と同等のアクティビティは ForEach<T> され、 ParallelForEach<T>ForEach<T> アクティビティには、値と本文の一覧が含まれています。 実行時に、リストが反復処理され、リスト内の各値に対して本文が実行されます。

ParallelForEach<T>にはCompletionConditionがあるため、CompletionConditionの評価でtrueが返された場合、ParallelForEach<T> アクティビティを早期に完了できます。 CompletionConditionは、各イテレーションが完了した後に評価されます。

ほとんどの場合、アクティビティの一般的なバージョンが推奨されるソリューションである必要があります。これは、アクティビティが使用されるシナリオの大部分をカバーし、コンパイル時に型チェックを提供するためです。 非ジェネリック バージョンは、非ジェネリック IEnumerable インターフェイスを実装する型を反復処理するために使用できます。

クラス定義

次のコード例は、非ジェネリック 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; }
}

本文 (省略可能)
コレクション内の各要素に対して実行されるObject型のActivityAction。 個々の要素は、Argument プロパティを使用して Body に渡されます。

値 (省略可)
反復処理される要素のコレクション。 コレクションのすべての要素が互換性のある型であることを確認することは、実行時に行われます。

CompletionCondition (省略可能)
CompletionCondition プロパティは、イテレーションの完了後に評価されます。 trueと評価された場合、スケジュールされた保留中のイテレーションは取り消されます。 このプロパティが設定されていない場合、Branchs コレクション内のすべてのアクティビティは完了するまで実行されます。

ParallelForEach の使用例

次のコードは、アプリケーションで ParallelForEach アクティビティを使用する方法を示しています。

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

ParallelForEach デザイナー

サンプルのアクティビティ デザイナーの外観は、組み込みの ParallelForEach<T> アクティビティに対して提供されるデザイナーと似ています。 デザイナーは、[ サンプル] の [ 一般的でないアクティビティ ] カテゴリのツールボックスに表示されます。 デザイナーの名前はツールボックスの ParallelForEachWithBodyFactory です。これは、アクティビティがツールボックスに IActivityTemplateFactory を公開し、適切に構成された ActivityActionでアクティビティを作成するためです。

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

サンプルを実行するには

  1. 選択したプロジェクトをソリューションのスタートアップ プロジェクトとして設定します。

    1. CodeTestClient は、 コードを使用してアクティビティを使用する方法を示しています。

    2. DesignerTestClient は、 デザイナー内でアクティビティを使用する方法を示しています。

  2. プロジェクトをビルドして実行します。