WF4状态机+书签

时间:2012-09-17 18:11:12

标签: .net workflow-foundation-4 sample

ve been searching a good simple sample for WF4 (or higher) state machine with resume (possibly BookMarks from the docs I读了)。 我想看看如何实现能够在WF内的任何给定状态下恢复的状态机。 因为我对WF一无所知,所以我想看一个简单的状态机,在那里我可以恢复上一次的状态,并且很高兴看到如何“强迫”WF跳转到一个州并从那里重新开始(如果可能的话)。 Thansk很多。

3 个答案:

答案 0 :(得分:1)

您需要实现这样的自定义活动:

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; }
    }
}

将此活动置于某个州内。您需要恢复每个书签后。

答案 1 :(得分:0)

Tyr Pro WF 4.5书籍章节。 4状态机示例。即使您没有该书,也可以从the Apress' book site下载示例源代码。

答案 2 :(得分:0)

根据恢复书签时传入的数据跳转/跳过某些状态的状态机听起来好像只是一个带有条件转换的状态机。

你的过渡可以像你想要的那样复杂,如果你如此倾向(它听起来像你要求的那样),它们可能是一个完全连接的图形。但是,如果你有很多状态,这可能会很快成为一个噩梦,所有的过渡和您可能需要的过渡条件。

在你做任何类似的事情之前,你可能想看一下微软的How to Choose Your Workflow Model in WF,并且可能会仔细考虑你应该建模什么状态以及什么可能适合作为变量。

要回答如何这样做的问题:

建立MSDN example on building a bookmark activity,您可以接受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工作流可能有一个使用输入参数的InitialState来告诉它要转到哪个“StartState”。

然后,每个中间状态可以使用Trigger作为上述活动进行单个转换,设置一个“NextState”局部变量,转换条件可以使用该变量来确定接下来要转到哪个状态。

使用StateMachine这种方式的一个极端例子可能是:如果你有一个StateMachine“ChessBoard”和一个名为“White Queen”的实例,其当前状态为“e4”,你的Resume Bookmark调用可能会引发争论“ e5“并接受将”白皇后“移至州”e5“。