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唤醒.

  • 相关阅读:
    网友谈:Dictionary.ContainsKey和List.BinarySearch哪个效率高
    C# WinForm 中在窗口标题栏上加按钮
    将Txt文件转换成dataset[原创]
    四个常见的排序算法[原创]
    改版后的groupbox[原创]
    转 五种提高 SQL 性能的方法
    转 牢记!SQL Server数据库开发的二十一条军规(SQL收藏)
    源码详解Java的反射机制
    java多线程采集+线程同步
    jQgrid API
  • 原文地址:https://www.cnblogs.com/hzb2001/p/9066232.html
Copyright © 2011-2022 走看看