StateMachine アクティビティを利用する場合には最低限必要な構成があります。
- 一つの InitializeState アクティビティ
- 一つの FinalState アクティビティ
- 一つ以上の State アクティビティ
実際にデザイナ上にドロップした際には InitializeState アクティビティが自動で配置されます。FinalState アクティビティや一つ以上の State アクティビティは実際のところ無くてもいいのですが、それでは StateMachine アクティビティの意味がないというかw
これらの中で設定が必要になる箇所も複数あります。
まずは各 State アクティビティを結ぶ Transition アクティビティ。プロパティダイアログ上では Condition プロパティと DisplayName プロパティしか表示されていません。Condition プロパティはこの遷移を行うための条件、DisplayName プロパティはデザイナ上で表示する文字を設定します。しかし本当に必要なのはここではなく、Transition アクティビティをダブルクリックした際に表示される詳細内容の方となります。
ダブルクリックするとこのような表示に切り替わります。アクティビティデザイナ上には Trigger、Condition、Action の 3 つが用意されています。この中で Condition については先程プロパティダイアログで設定するものと同一です。
Action には Condition を満たした場合に実行する処理を、Trigger にはこの遷移を行う際に実施する処理内容を設定します。しかしここに注意点があります。State から複数の Transition を引き動作の確認を行ってもらうとわかるのですが、Trigger に設定した内容は「非同期で必ず実行される」挙動になります。
動作確認として次のようなサンプル StateMachine ワークフローを用意して見ました。
これがワークフローの全体図です。最初の State アクティビティで「 2 回ループしたら終わる」的な処理を行おうとしたものです。
State アクティビティの内部ではこのように単純にコンソールへログを出力するだけとしました。
これがループさせる側の Transition アクティビティの設定です。Condition プロパティではループ回数を表す変数が2未満、と設定しています。Action 部分でカウンタのインクリメントを行い、Trigger 部ではログを出力した後に少し Delay アクティビティで待たせることを設定しました。
もう片方の FainlState アクティビティへと接続された Transition アクティビティではこのように設定を行います。Condition プロパティは空欄とし、Action も Trigger もログを出力するだけとします。この状態のStateMachineワークフローを実行すると次のように出力されました。
このように Transition アクティビティの Trigger 部に設定した処理は Condition プロパティの内容に関わらず「必ず」実行されます。2度ほど繰り返した後に、FinalState アクティビティに接続されている側の Transition アクティビティの Action 部に設定された処理が実行されています。その直前で ループ側 Transition アクティビティの Trigger が実行されているのは謎ですが、恐らく正式版では解消されているものと思います。
Condition プロパティが満たされた場合に Action 部に設定された処理が実行される、のですがこれも先程の結果を見ていただけるとわかる通り、もう少し追加条件があります。
「ある State アクティビティから発生している各 Trasition プロパティの Condition をチェックし、全て False であった場合に Condition 未設定の Transition アクティビティが呼び出される」
わかりにくいと思いますが、大体このような挙動です。
0 件のコメント:
コメントを投稿