WF4.5 状态机使用WorkflowApplication 持久化的作用Idle状态与Bookmark(三)

持久化数据库有什么样的作用?要验证作用首先需要使工作流Idle,如何使WorkflowApplication工作流Idle呢?添加书签,以下是添加书签的方法。

新建一个类BookMarkActivity

WF4.5 状态机使用WorkflowApplication 持久化的作用Idle状态与Bookmark(三)_第1张图片

此类继承NativeActivity

重写

protected override bool CanInduceIdle
        {
            get
            {
                return true;
            }
        }

属性,这说明工作流执行到此活动的时候,将进入Idle等待状态,这时候,实列信息将会持久化到数据库里面。

添加

public InArgument<string> BookmarkName { get; set; }

属性,将输入为bookMark名称,这个名称是外部调用此BookMark的名称。

重写Execute方法,在Execute方法内创建BookMark

protected override void Execute(NativeActivityContext context)
{
            context.CreateBookmark(
                this.BookmarkName.Get(context),
                (activityContext, bookmark, value) =>
                    {
                        Console.WriteLine("Call BookMark");
                    });
            Console.WriteLine("BookMark");
 }

CreateBookmark 第二个参数是一个回调函数,就是外部调用此BookMark的时候,当调用此函数。

以下是此类的全部:

using System;
using System.Activities;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestWorkFlow
{
    public class BookMarkActivity : NativeActivity
    {

        #region Public Properties

        /// <summary>
        /// Gets or sets BookmarkName.
        /// </summary>
        public InArgument<string> BookmarkName { get; set; }

        #endregion

        #region Properties

        /// <summary>
        /// Gets a value indicating whether CanInduceIdle.
        /// </summary>
        protected override bool CanInduceIdle
        {
            get
            {
                return true;
            }
        }

        #endregion

        #region Methods

        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        protected override void Execute(NativeActivityContext context)
        {
            context.CreateBookmark(
                this.BookmarkName.Get(context),
                (activityContext, bookmark, value) =>
                {
                    Console.WriteLine("BookMarkCallBack");
                });
            Console.WriteLine("BookMarkCreate Complete");
        }

        #endregion
    }
}

添加完成后从新编译,打开StateMachineWorkFlow.xaml,将会在工具栏中看到

BookMarkActivity

WF4.5 状态机使用WorkflowApplication 持久化的作用Idle状态与Bookmark(三)_第2张图片

双击FinalWait,将BookMarkActity添加进去,写上BookMark的名称(注意:此BookMarkName的名称是在外面调用的名称)。

WF4.5 状态机使用WorkflowApplication 持久化的作用Idle状态与Bookmark(三)_第3张图片

此时工作流执行到这里的时候,将会进入Idle状态,线程结束,将工作流的实列信息持久化到数据库里。这样意味着,我不管进程结束,系统重启,我只要有工作流的Id,我都可以接着刚才的执行。

在FinalState里添加输入Final Current Instance,以方便查看信息:

WF4.5 状态机使用WorkflowApplication 持久化的作用Idle状态与Bookmark(三)_第4张图片

然后编译运行工作流得到如下结果:

WF4.5 状态机使用WorkflowApplication 持久化的作用Idle状态与Bookmark(三)_第5张图片

没有输出,最后添加的输出” Final Current Instance”因为当工作流执行到

BookMarkActivity已经将工作流进入了Idle状态。

如何接着下面的执行呢?

在Program类里面添加如下

application.ResumeBookmark("FinalWait", null);

第一个参数是你BookMark的名称,第二个则是作为参数传递给书签恢复时所调用的方法的对象。

这里没有所以输入为空.

 

            //创建活动实例
            StateMachineWorkFlow context = new StateMachineWorkFlow();

            //创建单实例工作流宿主
            WorkflowApplication application = new WorkflowApplication(context);

            //添加持久化数据库
SqlWorkflowInstanceStore instanceStore = new SqlWorkflowInstanceStore(@"Data Source=.\SQLEXPRESS;Initial Catalog=SampleInstanceStore;Integrated Security=True;Asynchronous Processing=True");

            //将持久化数据库添加到工作流宿主主机里面去
            application.InstanceStore = instanceStore;

            //执行
            application.Run();

            application.ResumeBookmark("FinalWait",null);


          Console.ReadLine();

运行得到如下结果:

WF4.5 状态机使用WorkflowApplication 持久化的作用Idle状态与Bookmark(三)_第6张图片

调用application.ResumeBookmark("FinalWait",null);

已经接着下面的执行了。

前四章源代码:http://files.cnblogs.com/qugangf/TestWorkFlow.rar

你可能感兴趣的:(application)