• WF4.0 自定义CodeActivity与Bookmark<第三篇>


    一、自定义CodeActivity

      CodeActivity用于自定义一段代码,可实现你自己写的任意功能。

      要注意的有两点:

      1、自定义CodeActivity必须继承自CodeActivity;
      2、Execute是你想要执行的代码,CodeActivityContext对象参数与原有工作流进行交互。

      CodeActivityContext从ActivityContext继承了如下2个常用方法:

    方法/属性 说明
    ActivityInstanceId 获取当前正在执行的活动实例的唯一标识符。
    WorkflowInstanceId 获取当前正在执行的工作流实例的唯一标识符
    GetValue() 获取指定的 Argument 的值
    SetValue() 为指定的 Argument 赋值

      右键工作流项目=》新建项=>活动,可以添加一个CodeActivity。

      

      其代码如下:

        public sealed class CodeActivity1 : CodeActivity
        {
            //调用此自定义活动必须用一个变量接收返值
            public OutArgument<string> Result { get; set; }
            protected override void Execute(CodeActivityContext context)
            {string input = Console.ReadLine();
                //为外部工作流赋值
                context.SetValue(Result, input);
            }
        }

      代码逻辑为,将读取到的内容为外部变量赋值。

      当完成添加之后,在左侧菜单就能够看到该控件。

      

      工作流如下:

      

      需要定义一个变量variable1,并用此设置自定义Code活动的Result属性;

      

      执行效果如下:

      

    二、Bookmark

      Bookmark与CodeActivity的区别

    • 当工作流运行至Bookmark时,Bookmark会让工作流在此处挂起(Idel),是线程挂起,如果是Web请求处理程序执行,将不会返回,等待恢复。而Code不会挂起;
    • Code继承自CodeActivity,而Bookmark需继承自NativeActivity;

      设计一个Bookmark<T>如下:

        public sealed class Bookmark1<T> : NativeActivity<T>
        {
            public InArgument<string> InParam { get; set; }
            protected override bool CanInduceIdle
            {
                get{ return true; }
            }
            protected override void Execute(NativeActivityContext context)
            {
                this.Result.Set(context, "结果传出");
                context.CreateBookmark("Borkmark1", new BookmarkCallback(bookmarkCallback));
            }
            //恢复运行时的回调函数
            void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj)
            {
                MessageBox.Show("恢复运行,传入的参数是:" + obj);    //接收到的参数
                this.Result.Set(context, (T)obj);
            }
        }

      新建一个工作流如下:

      

      新建一个WinFrom程序如下:

      

      其代码如下:

        public partial class Form1 : Form
        {
            WorkflowApplication instance = null;
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1());
                instance.OnUnhandledException = unhandledExceptionl;
                instance.Aborted = aborted;
                instance.Idle = workflowIdel;
                instance.Completed = workflowCompleted;
                instance.Run();
            }
            private void button2_Click(object sender, EventArgs e)
            {
                if (instance.GetBookmarks().Count() == 1)
                {
                    BookmarkResumptionResult BRR = instance.ResumeBookmark(instance.GetBookmarks()[0].BookmarkName,"inPut");
                    MessageBox.Show("Bookmark恢复执行:" + BRR.ToString());
                }
            }
            void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
            {
                MessageBox.Show("完成!");
            }
            void aborted(WorkflowApplicationAbortedEventArgs e)
            {
                MessageBox.Show("中止!");
            }
            UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
            {
                MessageBox.Show("异常!");
                return UnhandledExceptionAction.Cancel;
            }
            void workflowIdel(WorkflowApplicationIdleEventArgs e)
            {
                MessageBox.Show("挂起!");
            }
        }

      其执行效果为:

        点击启动工作流 => 弹出"挂起" => 点击恢复运行 => 弹出"Bookmark恢复运行:Success" => 弹出"恢复运行,传入的参数是inPut" => 弹出"完成"

      基本上运行一次就知道这种执行顺序了。

      BookMark是一个非常重要的工具,它能够暂停工作流的执行,让工作流进入空闲状态。这在状态机工作流中是非常有用的。尤其状态机与MVC结合实现会签功能的时候,非常完美。

      详细示例请查看<第二篇>;

  • 相关阅读:
    jQuery操作字符串
    jQuery判断复选框是否被选中的3种方式
    19使用推模式和拉模式实现电梯超重报警
    18不使用委托实现能自动侦测车距的智能汽车
    动态创建html元素的几种方法
    17委托异步调用方法
    MVC文件上传09-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹,并在其中创建分类子文件夹
    MVC文件上传08-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹
    MVC文件上传07-使用客户端jQuery-File-Upload插件和服务端Backload组件裁剪上传图片
    MVC文件上传06-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义控制器上传多个文件
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3990813.html
Copyright © 2020-2023  润新知