非ジェネリック ParallelForEachNon-generic ParallelForEach

.NET Framework 4.6.1.NET Framework 4.6.1 のツールボックスには、制御フロー アクティビティのセットが用意されています。これには、ParallelForEach<T> コレクションを反復処理できる IEnumerable<T> が含まれています。ships in its toolbox a set of Control Flow activities, including ParallelForEach<T>, which allows iterating through IEnumerable<T> collections.

ParallelForEach<T> では、Values プロパティを IEnumerable<T>型にする必要があります。ParallelForEach<T> requires its Values property to be of type IEnumerable<T>. このため、ユーザーは、IEnumerable<T> インターフェイス (ArrayList など) を実装するデータ構造を反復処理できません。This precludes users from iterating over data structures that implement IEnumerable<T> interface (for example, ArrayList). ParallelForEach<T> の非ジェネリック バージョンにはこの要件はありませんが、コレクション内の値の型の互換性を確保するために実行時の複雑さが増します。The non-generic version of ParallelForEach<T> overcomes this requirement, at the expense of more run-time complexity for ensuring the compatibility of the types of the values in the collection.

このサンプルでは、非ジェネリックの ParallelForEach<T> アクティビティとそのデザイナーを実装する方法を示します。This sample shows how to implement a non-generic ParallelForEach<T> activity and its designer. このアクティビティは、ArrayList の反復処理に使用できます。This activity can be used to iterate through ArrayList.

ParallelForEach アクティビティParallelForEach activity

/ C#Visual Basic foreach ステートメントは、コレクションの要素を列挙し、コレクションの各要素に対して埋め込みステートメントを実行します。The C#/Visual Basic foreach statement enumerates the elements of a collection, executing an embedded statement for each element of the collection. このステートメントに相当する WFWF のアクティビティは、ForEach<T> および ParallelForEach<T> です。The WFWF equivalent activities are ForEach<T> and ParallelForEach<T>. ForEach<T> アクティビティには、値のリストと本体が含まれます。The ForEach<T> activity contains a list of values and a body. 実行時に、リストが反復処理されて、リスト内の値ごとに本体が実行されます。At runtime, the list is iterated and the body is executed for each value in the list.

ParallelForEach<T> には CompletionCondition があります。そのため、ParallelForEach<T> の評価が CompletionCondition を返した場合、true アクティビティは早期に完了することがあります。ParallelForEach<T> has a CompletionCondition, so that the ParallelForEach<T> activity could complete early if the evaluation of the CompletionCondition returns true. CompletionCondition は、各イテレーションの完了後に評価されます。The CompletionCondition is evaluated after each iteration is completed.

ほとんどの場合、ジェネリック バージョンのアクティビティを使用することをお勧めします。ジェネリック バージョンのアクティビティは、そのアクティビティを使用するシナリオの大半に対応し、コンパイル時の型チェックを提供するためです。For most cases, the generic version of the activity should be the preferred solution, because it covers most of the scenarios in which it is used and provides type checking at compile time. 非ジェネリック バージョンは、非ジェネリックの IEnumerable インターフェイスを実装する型を反復処理するために使用できます。The non-generic version can be used for iterating through types that implement the non-generic IEnumerable interface.

クラス定義Class definition

次のコード例は、非ジェネリックの ParallelForEach アクティビティの定義を示しています。The following code example shows the definition of a non-generic ParallelForEach activity is.

[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 (optional)
コレクション内の要素ごとに実行される ActivityAction 型の ObjectThe ActivityAction of type Object, which is executed for each element in the collection. 各要素は、Argument プロパティを使用して Body に渡されます。Each individual element is passed into the Body through its Argument property.

値 (省略可能) Values (optional)
反復処理される要素のコレクション。The collection of elements that are iterated over. コレクションのすべての要素の型が互換性のある型であることが実行時に確認されます。Ensuring that all elements of the collection are of compatible types is done at run-time.

補完条件 (省略可能) CompletionCondition (optional)
CompletionCondition プロパティは、イテレーションの完了後に評価されます。The CompletionCondition property is evaluated after any iteration completes. true であると評価する場合、スケジュールされた保留イテレーションはキャンセルされます。If it evaluates to true, then the scheduled pending iterations are canceled. このプロパティが設定されていない場合、分岐コレクション内のすべてのアクティビティは完了するまで実行されます。If this property is not set, all activities in the Branches collection execute until completion.

ParallelForEach の使用例Example of using ParallelForEach

アプリケーションでの ParallelForEach アクティビティの使用方法を次のコードに示します。The following code demonstrates how to use the ParallelForEach activity in an application.

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 designer

サンプルのアクティビティ デザイナーは、組み込みの ParallelForEach<T> アクティビティ用に提供されているデザイナーに外観が似ています。The activity designer for the sample is similar in appearance to the designer provided for the built-in ParallelForEach<T> activity. デザイナーは、[サンプル非ジェネリックアクティビティ] カテゴリの [ツールボックス] に表示されます。The designer appears in the toolbox in the Samples, Non-Generic Activities category. デザイナーのツールボックスにはParallelForEachWithBodyFactoryという名前が付けられます。これは、アクティビティが、適切に構成された ActivityActionを持つアクティビティを作成するツールボックス内の IActivityTemplateFactory を公開するためです。The designer is named ParallelForEachWithBodyFactory in the toolbox, because the activity exposes an IActivityTemplateFactory in the toolbox that creates the activity with a properly configured 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"
                }
            }
        };
    }
}

サンプルを実行するにはTo run the sample

  1. 選択したプロジェクトをソリューションのスタートアップ プロジェクトに設定します。Set the project of your choice as the startup project of the solution.

    1. Codetestclientは、コードを使用してアクティビティを使用する方法を示しています。CodeTestClient shows how to use the activity using code.

    2. デザイナ Testclientデザイナー内でアクティビティを使用する方法を示します。DesignerTestClient shows how to use the activity within the designer.

  2. プロジェクトをビルドおよび実行します。Build and run the project.

重要

サンプルは、既にコンピューターにインストールされている場合があります。The samples may already be installed on your machine. 続行する前に、次の (既定の) ディレクトリを確認してください。Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

このディレクトリが存在しない場合は、 Windows Communication Foundation (wcf) および Windows Workflow Foundation (WF) のサンプルの .NET Framework 4にアクセスして、すべての WINDOWS COMMUNICATION FOUNDATION (wcf) と WFWF サンプルをダウンロードしてください。If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. このサンプルは、次のディレクトリに格納されます。This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericParallelForEach