ve been searching a good simple sample for WF4 (or higher) state machine with resume (possibly BookMarks from the docs I
読みました)。WF 内の任意の状態で再開できるステート マシンを実装する方法を知りたいです。私は WF について何も知らないので、前回の状態で実行を再開できる単純なステート マシンを見たいと思っています。状態から再起動します (可能な場合)。どうもありがとう。
3 に答える
次のようなカスタム アクティビティを実装する必要があります。
public sealed class WaitForBookmark : NativeActivity
{
[RequiredArgument]
public InArgument<String> BookmarkName { get; set; }
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(BookmarkName.Get(context));
}
protected override bool CanInduceIdle
{
get { return true; }
}
}
このアクティビティをステート内に配置します。各ブックマークを再開する必要がある後。
Pro WF 4.5 の本のチャプターを試してみてください。4 ステート マシンの例。書籍をお持ちでない場合でも、Apress の書籍サイトからサンプル ソース コードをダウンロードできます。
ブックマークを再開するときに渡されたデータに基づいて特定の状態をジャンプ/スキップするステート マシンは、実際には条件付き遷移を備えた単なるステート マシンのように聞こえます。
トランジションは、必要に応じて複雑にすることができます。その気になっている場合は、完全に接続されたグラフにすることもできます (それはあなたが求めているように思えます)。しかし、多くの状態がある場合、必要なすべてのトランジションとトランジション条件により、これはすぐに悪夢になる可能性があります。
そのようなことを行う前に、Microsoft のHow to Choose Your Workflow Model in WFを参照して、状態としてモデル化する必要があるものと、変数として適切なものを慎重に検討することをお勧めします。
これを行う方法についての質問に答えるには:
ブックマークアクティビティの作成に関する MSDN の例に基づいて作成すると、Resume 引数を文字列またはオブジェクトとして受け入れることができます。この引数には、トランジションのどこに移動するかを決定するために必要な情報が含まれています。
public sealed class StateSelectorActivity : NativeActivity
{
// Define an activity input argument of type string
[RequiredArgument]
public InArgument<string> BookmarkName { get; set; }
public OutArgument<string> NextState { get; set; }
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(BookmarkName.Get(context), new BookmarkCallback(OnResumeBookmark));
}
protected override bool CanInduceIdle { get { return true; } }
public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
{
StateSelectorArguments args = obj as StateSelectorArguments;
if (args != null)
{
this.NextState.Set(context, args.NextState);
}
}
}
public class StateSelectorArguments
{
public string NextState { get; set; }
// ... Whatever else you want to pass in
}
そのため、いつでも任意の状態に移動できる StateMachine ワークフローには、入力引数を使用してどの "StartState" に移動するかを伝える InitialState が含まれる場合があります。
次に、各中間状態は、上記のアクティビティとしてトリガーを使用して単一の遷移を持つことができ、遷移条件が次に移動する状態を決定するために使用できる「NextState」ローカル変数を設定します。
StateMachine をこのように使用する極端な例としては、次のようなものがあります。 StateMachine "ChessBoard" と、現在の State "e4" を持つ "White Queen" というインスタンスがある場合、Resume Bookmark 呼び出しは引数 "e5" を受け取り、 「White Queen」を状態「e5」に移動することを受け入れます。