WF4:使用NonBlocking选项添加书签

时间:2013-07-05 07:50:45

标签: workflow-foundation-4

有没有人在BookmarkOptions.NonBlocking中使用CreateBookmark()? 我正在尝试将它与MultipleResume选项一起使用,但似乎我甚至无法恢复。

书签活动:

    public InArgument<string> BookmarkName { get; set; }
    public InArgument<BookmarkOptions> BookmarkOptions { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        var options = BookmarkOptions.Get(context);
        context.CreateBookmark(BookmarkName.Get(context),
                                          ReadCompleteCallback,options);
    }

测试代码:


 [TestMethod]
    public void TestMethod1()
    {
        InitWorkflow();
        wfat = WorkflowApplicationTest.Create(sm);
        wfat.TestActivity();
        Assert.IsTrue(wfat.WaitForIdleEvent());
        var res = wfat.TestWorkflowApplication.ResumeBookmark("First", "data");
        Assert.IsTrue(res == BookmarkResumptionResult.Success, "Resumption fail with result:" + res);
        Assert.IsTrue(wfat.Bookmarks.Contains("First"), "No first bkmk");

    }


    private void InitWorkflow()
    {

        sm = new StateMachine()
        {
            States = 
             {        //First state with non blocking bookmark             
                 new State(){
                      DisplayName = "First",Entry = new BookmarkActivity(){BookmarkName = "First",BookmarkOptions =
                                BookmarkOptions.NonBlocking | BookmarkOptions.MultipleResume},
                      Transitions = 
                      {
                            new Transition(){ }
                     }
                 },    //Second state with blocking bookmark
                 new State(){
                     DisplayName = "Second",Entry =  new BookmarkActivity(){BookmarkName = "Second",BookmarkOptions =
                                BookmarkOptions.None},
                     Transitions = 
                     {
                         new Transition(){ }
                     }
                 },
                 new State(){
                     DisplayName = "End",
                    IsFinal = true
                 }
             }
        };
        sm.InitialState = sm.States[0];
        sm.InitialState.Transitions[0].To = sm.States[1];
        sm.States[1].Transitions[0].To = sm.States[2];
    }

以上测试代码中的ResumeBookmark结果为'NotFound'

我很感激任何演示NonBlocking选项的工作代码。

1 个答案:

答案 0 :(得分:1)

即使 NonBlocking 书签在完成创建活动的活动时也会被删除。它们允许活动继续执行,但就是这样。

您需要将活动维持在未完成状态(通常是外部活动)的底线,即使找到 NonBlocking 书签,其中的所有内容也会执行

这就是您收到 NotFound 错误的原因。创建书签的活动已结束,书签不再存在。

PS: NonBlocing 书签的某种常见用例是,例如,当你有一个长时间运行的活动时,可能会在执行时抛出异常,这样你就有可能恢复以前状态的工作流程。