持久化数据库有什么样的作用?要验证作用首先需要使工作流Idle,如何使WorkflowApplication工作流Idle呢?添加书签,以下是添加书签的方法。
新建一个类BookMarkActivity
此类继承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
双击FinalWait,将BookMarkActity添加进去,写上BookMark的名称(注意:此BookMarkName的名称是在外面调用的名称)。
此时工作流执行到这里的时候,将会进入Idle状态,线程结束,将工作流的实列信息持久化到数据库里。这样意味着,我不管进程结束,系统重启,我只要有工作流的Id,我都可以接着刚才的执行。
在FinalState里添加输入Final Current Instance,以方便查看信息:
然后编译运行工作流得到如下结果:
没有输出,最后添加的输出” 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();
运行得到如下结果:
调用application.ResumeBookmark("FinalWait",null);
已经接着下面的执行了。