WF4.0和BookMark

来源:互联网 发布:网络电玩游戏 编辑:程序博客网 时间:2024/05/02 00:02

       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窗体


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

依次执行按钮结果为:




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

0 0
原创粉丝点击