このトピックの内容は、Windows Workflow Foundation 4 に該当します。
このサンプルでは、他の Activity オブジェクトをスケジュールしてワークフローの実行のフローを制御する NativeActivity を作成する方法を示します。この方法を示すために、このサンプルでは一般的な制御フローである Sequence と While の 2 つを使用します。
サンプルの詳細
MySequence
について最初に注意しなければならないのは、NativeActivity から派生していることです。NativeActivity は、Execute
メソッドに渡される NativeActivityContext を通じて ActivityRuntime 一式を公開する Activity オブジェクトです。
MySequence
は、ワークフローの作成者によって設定された Activity オブジェクトのパブリック コレクションを公開します。ワークフローの実行前に、ワークフロー ランタイムがワークフローの各アクティビティに対して CacheMetadata メソッドを呼び出します。このプロセスの実行中に、ランタイムによって、データのスコープや有効期間を管理するための親子のリレーションシップが確立されます。CacheMetadata メソッドの既定の実装では、MySequence
アクティビティの TypeDescriptor インスタンス クラスを使用して、Activity 型または IEnumerable<Activity> 型のパブリック プロパティを MySequence
アクティビティの子として追加します。
アクティビティで子アクティビティのパブリック コレクションを公開するときは、それらの子アクティビティ間で状態を共有すると考えられます。そのため、親アクティビティ (この場合は MySequence
) で、子アクティビティがそれを実現するための変数のコレクションも公開することをお勧めします。子アクティビティと同様に、CacheMetadata メソッドで、Variable 型または IEnumerable<Variable> 型のパブリック プロパティを MySequence
アクティビティに関連付けられた変数として追加します。
MySequence
の子によって操作されるパブリック変数に加えて、MySequence
では、子の実行の進行状況を追跡する必要もあります。これを実現するために、プライベート変数 currentIndex
を使用します。この変数は、MySequence
アクティビティの CacheMetadata メソッド内に AddImplementationVariable メソッドの呼び出しを追加することで、MySequence
環境の一部として登録されています。MySequence
Activities
コレクションに追加された Activity オブジェクトは、この方法で追加された変数にアクセスできません。
MySequence
をランタイムで実行すると、ランタイムがその Execute メソッドを呼び出し、NativeActivityContext を渡します。NativeActivityContext は、引数や変数の逆参照、および他の Activity オブジェクト (ActivityDelegates
) のスケジュールを行うためにランタイムに戻されるアクティビティのプロキシです。MySequence
では、InternalExecute
メソッドを使用して、最初の子および後続のすべての子をスケジュールするロジックを 1 つのメソッドにカプセル化しています。このメソッドは、まず currentIndex
を逆参照します。Activities
コレクションに含まれる数と等しい場合、シーケンスは終了し、アクティビティが処理をスケジュールせずに戻り、ランタイムによって状態が Closed に変更されます。currentIndex
がアクティビティの数より少ない場合は、Activities
コレクションから次の子が取得され、MySequence
が ScheduleActivity を呼び出して、スケジュールする子、および InternalExecute
メソッドを指す CompletionCallback を渡します。最後に、currentIndex
がインクリメントされ、制御がランタイムに戻されます。MySequence
のインスタンスで子 Activity オブジェクトがスケジュールされていれば、ランタイムはそのインスタンスの状態が Executing であると見なします。
子アクティビティが完了すると、CompletionCallback が実行され、ループが先頭から継続されます。Execute
と同様、CompletionCallback は ActivityExecutionContext を受け取り、実装側へのアクセスをランタイムに提供します。
MyWhile
が MySequence
と異なるのは、1 つの Activity オブジェクトを繰り返しスケジュールし、Condition
という名前の Activity<bool> を使用して、そのスケジュールを実行するかどうかを判断することです。MySequence
と同様に、MyWhile
でも、InternalExecute
メソッドを使用してスケジュール ロジックを集中化しています。OnEvaluationCompleted
という名前の CompletionCallback<bool> を使用して Condition
Activity<bool> をスケジュールします。Condition
の実行が完了すると、その結果を、この CompletionCallback を通じて、result
という名前の厳密に型指定されたパラメーターで使用できるようになります。true
の場合、MyWhile
は ScheduleActivity を呼び出し、CompletionCallback として Body
Activity オブジェクトと InternalExecute
を渡します。Body
の実行が完了すると、InternalExecute
でもう一度 Condition
がスケジュールされ、再度ループが開始されます。Condition
が false を返すと、MyWhile
のインスタンスが Body
をスケジュールせずに制御をランタイムに戻し、ランタイムによって状態が Closed に変更されます。
サンプルを設定、ビルド、および実行するには
Visual Studio 2010 で Composite.sln サンプル ソリューションを開きます。
ソリューションをビルドして実行します。
![]() |
---|
サンプルは、既にコンピューターにインストールされている場合があります。続行する前に、次の (既定の) ディレクトリを確認してください。
<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\Basic\CustomActivities\Code-Bodied\CustomCompositeNativeActivity
|