非ジェネリックの ParallelForEach

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

.NET Framework Version 4 のツールボックスには、制御フロー アクティビティのセットが用意されています。これには、IEnumerable コレクションを反復処理できる ParallelForEach が含まれています。

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

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

ParallelForEachT アクティビティ

C# および VB の foreach ステートメントは、コレクションの要素を列挙し、コレクションの各要素に対して埋め込みステートメントを実行します。このステートメントに相当する WF のアクティビティは、ForEach および ParallelForEach です。ForEach アクティビティには、値のリストと本体が含まれます。実行時に、リストが反復処理されて、リスト内の値ごとに本体が実行されます。

ParallelForEach には CompletionCondition があります。そのため、CompletionCondition の評価が true を返した場合、ParallelForEach アクティビティは早期に完了することがあります。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; } 
}
  • Body (省略可能)
    コレクション内の要素ごとに実行される Object 型の ActivityAction。各要素は、Argument プロパティを使用して Body に渡されます。
  • Values (省略可能)
    反復処理される要素のコレクション。コレクションのすべての要素の型が互換性のある型であることが実行時に確認されます。
  • CompletionCondition (省略可能)
    CompletionCondition プロパティは、イテレーションの完了後に評価されます。true であると評価する場合、スケジュールされた保留イテレーションはキャンセルされます。このプロパティが設定されていない場合、分岐コレクション内のすべてのアクティビティは完了するまで実行されます。

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 アクティビティ用に提供されているデザイナーに外観が似ています。このデザイナーは、ツールボックスの [サンプル][非ジェネリック アクティビティ] カテゴリにあります。このデザイナーのツールボックスにおける名前は ParallelForEachWithBodyFactory です。これは、適切に構成された ActivityAction を使用してアクティビティを作成する IActivityTemplateFactory がツールボックスでアクティビティによって公開されるためです。

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. プロジェクトをビルドして実行します。

Ee835856.Important(ja-jp,VS.100).gif 注 :
サンプルは、既にコンピューターにインストールされている場合があります。続行する前に、次の (既定の) ディレクトリを確認してください。

<InstallDrive>:\WF_WCF_Samples

このディレクトリが存在しない場合は、「.NET Framework 4 向けの Windows Communication Foundation (WCF) および Windows Workflow Foundation (WF) のサンプル」にアクセスして、Windows Communication Foundation (WCF) および WF のサンプルをすべてダウンロードしてください。このサンプルは、次のディレクトリに格納されます。

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