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

一、自定义CodeActivity

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

  要注意的有两点:

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

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

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

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

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

  其代码如下:

    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);

        }

    }

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

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

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

  工作流如下:

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

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

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

  执行效果如下:

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

二、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);

        }

    }

  新建一个工作流如下:

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

  新建一个WinFrom程序如下:

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

  其代码如下:

    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结合实现会签功能的时候,非常完美。

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

你可能感兴趣的:(Activity)