ステート マシン ワークフロー

ステート マシンは、プログラムの開発に関する、よく知られたパラダイムの 1 つです。 StateMachine アクティビティを、StateTransition および他のアクティビティと共に使用することで、ステート マシン ワークフロー プログラムをビルドできます。 このトピックでは、ステート マシン ワークフローの概要について説明します。

ステート マシン ワークフローの概要

ステート マシン ワークフローで使用するモデル化スタイルでは、ワークフローをイベント ドリブン型にモデル化します。 StateMachine アクティビティは、ステート マシンのロジックを構成する状態および遷移を含んでおり、何かのアクティビティを使用する任意の場所で使用できます。 ステート マシン ランタイムには、次に示すいくつかのクラスがあります。

ステート マシン ワークフローを作成するときは、StateMachine アクティビティに状態が追加され、状態間のフローのコントロールには遷移が使用されます。 次のスクリーン ショット (「チュートリアル入門」の「方法: ステート マシン ワークフローを作成する」のステップからの引用) は、3 つの状態と 3 つの遷移が含まれるステート マシン ワークフローを示しています。 [ターゲットの初期化] は初期状態であり、ワークフローの最初の状態を表します。 これは [開始] ノードから伸びる線によって示されます。 ワークフローの最終状態は [FinalState] と呼ばれ、ワークフローが完了するポイントを表します。

Illustration that shows the completed state machine workflow.

ステート マシン ワークフローには、初期状態が 1 つのみ、および最終状態が少なくとも 1 つ必要です。 最終状態以外の各状態には、遷移が少なくとも 1 つ必要です。 以降のセクションでは、状態および遷移の作成と構成について説明します。

状態の作成および構成

State はステート マシンの状態を表します。 State をワークフローに追加するには、[ツールボックス][ステート マシン] セクションから [State] のアクティビティ デザイナーをドラッグして、Windows ワークフロー デザイナー サーフェイス上の StateMachine アクティビティにドロップします。

Screenshot of the State Machine section of the Toolbox.

ある状態を [初期状態] として構成するには、状態を右クリックして [初期状態として設定] をクリックします。 また、現在の初期状態がない場合に初期状態を指定するには、ワーク フローの一番上の [開始] ノードから、初期状態にする状態まで線をドラッグします。 StateMachine のアクティビティをワークフロー デザイナーにドロップすると、そのアクティビティには、[State1] という名前の初期状態があらかじめ構成されます。 ステート マシン ワークフローには初期状態が 1 つのみ必要です。

ステート マシンを終了させる状態を表す状態は、最終状態と呼ばれます。 最終状態とは、IsFinal プロパティが true に設定され、Exit のアクティビティを持たず、そこから発生する遷移がない状態です。 最終状態をワークフローに追加するには、[ツールボックス][ステート マシン] セクションから [FinalState] のアクティビティ デザイナーをドラッグして、Windows ワークフロー デザイナー サーフェイス上の StateMachine アクティビティにドロップします。 ステート マシン ワークフローには最終ステートが少なくとも 1 つ必要です。

エントリおよび終了アクションの構成

状態には、Entry アクションおよび Exit アクションを設定できます (最終状態として構成された状態にはエントリ アクションを 1 つのみ設定できます)。 ワークフロー インスタンスが、ある状態に入ると、エントリ アクションのあらゆるアクティビティが実行されます。 エントリ アクションが完了すると、状態の遷移のトリガーがスケジュールされます。 別のステートへの遷移が確認されると、状態遷移が同じ状態に戻ったとしても、終了アクションのアクティビティが実行されます。 終了のアクションが完了すると、遷移のアクションのアクティビティが実行され、その新しい状態が遷移され、エントリ アクションがスケジュールされます。

注意

ステート マシン ワークフローをデバッグするときは、ステート マシン ワークフロー内のルート ステート マシンのアクティビティおよび状態にブレークポイントを設定できます。 ブレークポイントを設定できる対象は、状態内または遷移内の任意のアクティビティです。遷移に対して直接設定することはできません。

遷移の作成および構成

最終状態以外のすべての状態には遷移が少なくとも 1 つ必要です。遷移がなくてよいのは最終状態のみです。 遷移は、状態マシン ワークフローに状態を追加した後に追加されます。または、状態をドロップしたときに作成されます。

1 回の手順で State を追加して遷移を作成するには、[ツールボックス][ステート マシン] から [State] のアクティビティをドラッグして、ワークフロー デザイナー内の他の状態の上に置きます。 ドラッグされている State が別の State の上にある場合、もう一方の State の周囲に 4 つの三角形が表示されます。 State を 4 つの三角形のいずれかにドロップすると、ステート マシンに追加され、遷移元の State からドロップされた遷移先の State に遷移が作成されます。 詳細については、「Transition アクティビティ デザイナー」を参照してください。

状態の追加後に遷移を作成する方法は 2 つあります。 1 つ目は、ワークフロー デザイナー サーフェスから状態をドラッグして既存の状態の上に置き、ドロップ ポイントのいずれかにドロップする方法です。 これは、前のセクションで説明した方法に似ています。 もう 1 つは、マウス ポインターを目的のソースの状態の上に置き、線を適切な目的の状態にドラッグする方法です。

注意

ステート マシンの 1 つの状態では、ワークフロー デザイナーを使用して作成された遷移を最大 76 個まで含めることができます。 デザイナー以外で作成されたワークフローの状態の遷移に関する制限は、システム リソースによってのみ制限されます。

遷移は TriggerCondition、および Action を持つことができます。 遷移の Trigger は、遷移のソース状態の Entry アクションが完了するときにスケジュールされます。 通常 Trigger は、ある種のイベント発生を待つアクティビティですが、その他のアクティビティであっても、または何もアクティビティがなくてもかまいません。 Trigger のアクティビティが完了したら、Condition がある場合は評価されます。 Trigger のアクティビティがない場合、Condition は直ちに評価されます。 条件が false になる場合、遷移はキャンセルされ、その状態からのすべての遷移の Trigger アクティビティは再スケジュールされます。 現在の遷移と同じソースの状態を共有する他の遷移がある場合、Trigger のアクションもキャンセルされて、再スケジュールされます。 Conditiontrue である場合、または条件がない場合、ソース状態の Exit のアクションが実行され、遷移の Action が実行されます。 Action が完了すると、コントロールは [ターゲット] 状態を渡します

共通トリガーを共有する遷移は、共有トリガー遷移と呼ばれます。 共有トリガー遷移グループに含まれる遷移は、いずれも同じトリガーを使用しますが、それぞれの Condition およびアクションは一意です。 遷移に追加のアクションを追加して共有遷移を作成するには、目的の遷移の始点を表す円をクリックし、目的の状態にドラッグします。 新しい遷移では最初の遷移と同じトリガーが共有されますが、その条件とアクションは一意になります。 共有遷移は、遷移デザイナー内から作成することもできます。これには、遷移デザイナーの下部にある [トリガーを共有する遷移の追加] をクリックし、 [接続の使用可能な状態] ボックスの一覧で、目的となる対象の状態を選択します。

注意

遷移の ConditionFalse と評価された場合 (またはトリガーを共有する遷移すべての状態が False と評価された場合)、遷移は行われず、その状態からのすべての遷移のすべてのトリガーが再スケジュールされます。

ステート マシン ワークフローの作成の詳細については、「方法: ステート マシン ワークフローを作成する」、「StateMachine アクティビティ デザイナー」、「State アクティビティ デザイナー」、「FinalState アクティビティ デザイナー」、「Transition アクティビティ デザイナー」を参照してください。

ステート マシン用語

このセクションでは、このトピック全体で使用しているステート マシン用語の定義を示します。

State
ステート マシンを構成する基本単位。 1 つのステート マシンは、任意の特定の時点において 1 つの状態をとることができます。

エントリ アクション
状態に入るときに実行されるアクティビティです。

終了アクション
状態を終了するときに実行されるアクティビティです。

切り替え効果
2 つの状態を結ぶ、方向を持った関係。あるステート マシンが特定の種類のイベントの発生に対して行う応答全体を表します。

共有遷移
1 つ以上の別の遷移と同じソースの状態およびトリガーを共有する遷移。一意の条件とアクションを持ちます。

トリガー
遷移を発生させるトリガー アクティビティです。

条件
トリガーが発生した後でその遷移を完了させるために true に評価される必要のある制約です。

遷移アクション
特定の遷移を実行するときに実行されるアクティビティです。

条件付き遷移
明示的な条件付きの遷移です。

自己遷移
ある状態から、それと同じ状態に遷移する遷移です。

初期状態
ステート マシンの開始ポイントを示す状態です。

最終状態
ステート マシンの完了を示す状態です。

関連項目