zoukankan      html  css  js  c++  java
  • WF中的Bookmark

    最近在学习WF, 把自己的一些学习心得放上来

    Bookmark允许你以事件驱动的方式与一个Workflow内的Activity进行交互. 如果把启动一个workflow比做开始读一本书, 在Workflow中的Bookmark起到的就是和书中的Bookmark一样的作用, 就是标记现在到哪了, 以后可以从这里再继续.

    但是Bookmark在原生的Activity中没有, 只能自己创建, 而且是继承自NativeActivity.

      public sealed class noResultBookmark : NativeActivity  //继承自NativeActivity
        {
            public InArgument<string> bookmarkName { get; set; }  //创建一个输入类型参数
            protected override bool CanInduceIdle   //允许InduceIdle
            {
                get
                {    return true;    }
            }
            protected override void Execute(NativeActivityContext context)
            {
                string bookmark = context.GetValue(bookmarkName);  //获取输入参数的值
                context.CreateBookmark(bookmark);  //创建Bookmark, 创建之后, 导致Workflow进入Idle状态, 引发Workflow Idle事件. 注意我们在这里没有加入Callback, 因为暂时没有返回值
                System.Console.WriteLine("创建bookmark:{0}", bookmark);
            }
        }  

    创建好后, 就可以使用了.

    接下来, 建立一个Winform, 让我们来试验一下:

    启动流程的代码如下:

     private void button_Run_Click(object sender, RoutedEventArgs e)
            {
                instance = new WorkflowApplication(new WFLibrary.noResultBookmarkWorkflow());
                instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
                instance.OnUnhandledException = unhandledExceptionl;
                instance.Aborted = aborted;
                instance.Idle = workflowIdel;
                instance.Run();
            }

    流程启动后, 首先执行的是WriteLine Activity. 可以在控制台中看到(第一行):

    接下来执行noResultBookmark Activity, 创建名为wxd的Bookmark(第二行). 

    创建Bookmark后, 引发了Workflow的Idle事件, 可以在控制台中看到Idle事件引发的痕迹(第三行), Workflow进入Idle状态, 执行告一段落.

    然后在Winform中输入Bookmark的名字wxd, 点击触发按钮.

     private void button_triggering_Click(object sender, RoutedEventArgs e)
            {
                string bookName = textBoxBookmark.Text;  //获取Bookmark的名字
    
                if (instance != null)
                {
                    if (instance.GetBookmarks().Count(p => p.BookmarkName == bookName) == 1)
                    {
                        instance.ResumeBookmark(bookName, null); //从此Bookmark重启Workflow
                    }
                    else
                    {
                        foreach (var v in instance.GetBookmarks()) //输入的Bookmark名字不对, Workflow Instance中没有这个BookMark
                        {
                            System.Console.WriteLine("--------请从下面选项中选择一个BookmarkName---------------------------");
                            System.Console.WriteLine("BookmarkName:{0}:,OwnerDisplayName:{1}", v.BookmarkName, v.OwnerDisplayName);
                            System.Console.WriteLine("================================");
                        }
                    }
                }
                else
                {
                    MessageBox.Show("没有创建实例");
                }
            }

    如果输入的Bookmark名字正确, Workflow Instance被从中断的地方唤醒, 继续下一个WriteLine Activity, 执行完后流程结束. 

    对Bookmark的理解, 其实最关键的地方就是, CreateBookmark会自动使Workflow进入Idle状态, 直到被ResumeBookmark唤醒.

  • 相关阅读:
    【java】对象赋值给另一个对象
    spring boot系列(五)spring boot 配置spring data jpa (查询方法)
    Spring Data JPA 查询
    Spring Data JPA 介绍
    OpenID简介
    OAUTH协议介绍
    URL encoding(URL编码)
    RESTful 介绍
    spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
    spring boot 启动报 java.lang.NoClassDefFoundError: ch/qos/logback/core/spi/LifeCycle 错误
  • 原文地址:https://www.cnblogs.com/hzb2001/p/9066232.html
Copyright © 2011-2022 走看看