WF4.0和BookMark

       WF4.0中加入了书签(Bookmark)机制,可以让活动在书签的位置挂起(Idel),是线程挂起,等待恢复。如果我们需要在活动没有完成的时候,提供额外的数据,这个时候我们就可以给活动注册一个书签,我们需要使用CreateNamedBookmark方法创建书签,该方法有三个参数一个名字,一BookmarkCallback的委托,当活动恢复的时候执行。和BookmarkOptions,Runtime为每个工作流实例维护一个Bookmarks的Table,每次有Bookmark要恢复的时候都回去check。

流程代码:

<span style="font-size:18px;">namespace workflow
{

    public sealed class TestActivity :NativeActivity 
    {

        #region 设置是否可以被持久化:bool CanInduceIdle { get { return true; } }
        /// <summary>
        /// 设置是否可以被持久化
        /// </summary>
        protected override bool CanInduceIdle { get { return true; } }
        #endregion
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(NativeActivityContext context)
        {
            //活动“workflow.TestActivity”无效。对于 NativeActivity 派生的活动,若其调用 System.Activities.NativeActivityContext 中定义的某个 CreateBookmark 重载,以便执行异步操作,则必须覆盖 CanInduceIdle 属性且返回 true。
            Console.WriteLine("创建书签,终止工作流");
            //创建书签
            context.CreateBookmark("bookmark", new BookmarkCallback(this.Continue));
            Console.WriteLine("恢复书签,流程继续");

        }
        void Continue(NativeActivityContext context, Bookmark bookmark, object obj)
        {
            //根据自己的需求,传一些值
        }
    }
}</span>
注意,这个函数是在BookMark创建时候的一个委托,表示在恢复Bookmark后调用的方法

新建一个windows窗体

WF4.0和BookMark_第1张图片

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">namespace from
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private string processInstanceID;
        private WorkflowApplication application;
        //启动流程并创建书签
        private void button1_Click(object sender, EventArgs e)
        {
            
            TestActivity activity = new TestActivity();



            application = new WorkflowApplication(activity);
            processInstanceID = application.Id.ToString();
            application.Run();
           
        }
        /// <summary>
        /// 恢复书签
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            TestActivity activity = new TestActivity();

            BookmarkResumptionResult BRR = application.ResumeBookmark(application.GetBookmarks()[0].BookmarkName, "inPut");
            MessageBox.Show("Bookmark恢复执行:" + BRR.ToString());
        }
    }
}</span></span></span>

依次执行按钮结果为:

WF4.0和BookMark_第2张图片



      这几篇总结的工作流知识点比较散,下来会通过一个实例来连接起来。敬请期待。

你可能感兴趣的:(bookmark,WF4.0)