1

ve been searching a good simple sample for WF4 (or higher) state machine with resume (possibly BookMarks from the docs I读过)。我想看看如何实现一个能够在 WF 内的任何给定状态下恢复的状态机。由于我对 WF 一无所知,我希望看到一个简单的状态机,我可以在其中恢复上次状态的执行,并且很高兴看到如何“强制”WF 跳转到一个状态并从那里重新开始(如果可能的话)。非常感谢。

4

3 回答 3

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

将此活动放入一个状态中。在您需要恢复每个书签之后。

于 2014-09-29T16:58:31.540 回答
0

试试 Pro WF 4.5 书的章节。4 个状态机示例。即使您没有这本书,也可以从Apress 的图书网站下载示例源代码。

于 2013-03-06T17:30:01.950 回答
0

在恢复书签时根据传入的数据跳转/跳过某些状态的状态机听起来就像它实际上只是一个具有条件转换的状态机。

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

在您执行此类操作之前,您可能需要查看 Microsoft 的如何在 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 工作流可能有一个 InitialState,它使用输入参数告诉它要转到哪个“StartState”。

然后每个中间状态可以有一个单一的转换,触发器作为上述活动,设置一个“NextState”局部变量,转换条件可以使用该变量来确定下一个进入哪个状态。

以这种方式使用 StateMachine 的一个极端示例可能是:如果您有一个 StateMachine“ChessBoard”和一个名为“White Queen”的实例,其当前状态为“e4”,则您的 Resume Bookmark 调用可能需要一个参数“e5”和接受将“白皇后”移动到状态“e5”。

于 2015-05-15T16:59:07.613 回答