Phoenix的天空
Any Program

最近在学习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唤醒.

 

posted on 2018-05-21 11:17  Phoenix Huang  阅读(184)  评论(0编辑  收藏  举报