博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WF4 持久化 <第四篇>
阅读量:5983 次
发布时间:2019-06-20

本文共 4293 字,大约阅读时间需要 14 分钟。

一、基础示例

  WF4 默认支持SQLServer的持续化,首先要执行目录C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的脚本:

  • SqlPersistenceService_Schema.sql
  • SqlPersistenceService_Logic.sql

  还是Bookmark的示例,新建一个工作流如下:

  

  其中,Bookmark代码如下:

public sealed class Bookmark1
: NativeActivity
{ public InArgument
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); } }

  新建一个Winform程序如下:

  

  代码如下:

public partial class Form1 : Form    {        WorkflowApplication instance = null;        SqlWorkflowInstanceStore instanceStore = null;        InstanceView view;        Guid guid = new Guid();        public Form1()        {            InitializeComponent();        }        public void InitialWorkflowApplication()        {            instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1());            instance.Idle = workflowIdel;   //为挂起绑定事件            instance.Completed = workflowCompleted;     //为完成绑定事件            instance.Unloaded = unload;            string connectionString = "Data Source=CZZ;Initial Catalog=xxoo;Integrated Security=True";            instanceStore = new SqlWorkflowInstanceStore(connectionString);            view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));            instanceStore.DefaultInstanceOwner = view.InstanceOwner;            instance.InstanceStore = instanceStore;        }        private void button1_Click(object sender, EventArgs e)        {            //初始化流程实例            InitialWorkflowApplication();            instance.Run();        }        //持久化        private void button3_Click(object sender, EventArgs e)        {            guid = instance.Id;            //只有绑定了InstanceStore的工作流才允许卸载            instance.Unload();        }        //从数据库加载        private void button4_Click(object sender, EventArgs e)        {            //初始化流程实例            InitialWorkflowApplication();            instance.Load(guid);        }        //从书签处恢复执行        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 workflowIdel(WorkflowApplicationIdleEventArgs e)        {            MessageBox.Show("挂起!");        }        void unload(WorkflowApplicationEventArgs e)        {            MessageBox.Show("卸载!");        }    }

  点击启动工作流,流程执行至Bookmark挂起。点击持续化,作为示例,本处直接Unload()了,WF4在Unload之前会持续化一次。同时,数据库中多个表会发现增加了一行。

  如果此时直接,恢复执行。由于工作流已被卸载,所以会报一个错误。所以,应该先点击加载Workflow,此时流程会根据Guid重新装载上次未执行完毕的流程继续执行。

二、SqlWorkflowInstanceStore

  SqlWorkflowInstanceStore是WF4提供的一个类,需要赋值到WorkflowApplication实例的InstanceStore属性。

  里面保存了数据库连接字符串以及流程所有者等信息。

  可用内容如下:

方法/属性 说明
ConnectionString 数据库连接字符串
DefaultInstanceOwner 实例的所有者
HostLockRenewalPeriod 指定时间段,宿主必须在该时间段内续订其在工作流服务实例上的锁
InstanceCompletionAction 工作流实例完成后采取的操作。两个取值:DeleteAll、DeleteNothing(完成后删还是不删)
InstanceEncodingOption 是否必须对实例数据进行压缩
InstanceLockedExceptionAction 当捕获InstanceLockedException时执行的操作
MaxConnectionRetries 获取或设置最大 SQL 连接重试次数,默认值为 4
RunnableInstancesDetectionPeriod 间隔多长时间执行检测任务。
Execute() 持久化命令,需要时供提供程序操作

三、持久化的方式

  有两种方式可以执行持久化。

  1、Unload();卸载,这样WF4会帮助我们持久化一次。

  2、Persist();仅仅执行持久化操作。

instance.Persist();instance.Unload();

  3、persist Activity的方式持久化

  往视图里添加一个persist控件,当流程执行到此步骤就会持久化,不管实例处于何种状态。实际上这也是调用一下instance.Persist();

  

  流程中最好不要带入一些不相关的变量或参数,因为SQLServer自带的持久化是要把这些数据序列化为二进制数据。如果不能序列化(没有加一个Dxxxx什么的标记的对象),则持续化不会生效。

转载地址:http://ooeox.baihongyu.com/

你可能感兴趣的文章
超越执行力的《知道力》热烈发售中。。。朋友们,给力啦!!!
查看>>
程序员技术练级攻略
查看>>
MySQL5.6更人性化修改redo log事务日志文件大小
查看>>
SonataEasyExtendsBundle功能包:安装
查看>>
【VMCloud云平台进阶篇】应用数据层面优化(一)
查看>>
MBR与GPT分区表
查看>>
深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
查看>>
电商黑马!揭秘拼多多日销千单新品活动玩法
查看>>
Linux下搭建JSP环境
查看>>
用ipad维护Linux服务器
查看>>
Windows勒索病毒防范、解决方法全攻略
查看>>
传统PC与虚拟桌面在管理维护上的对比
查看>>
TCP长连接与短连接的区别
查看>>
我的运维心得分享
查看>>
C51中~XBYTE 简介
查看>>
关于Memcache mutex设计模式的.net实现
查看>>
poj3067
查看>>
給windowsXP穿上Linux Ubuntu的漂亮馬甲
查看>>
Windows Phone 7 真机调试
查看>>
图灵4月书讯【黑客与画家将在4月10日左右隆重上市】
查看>>