一、基础示例

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

  • SqlPersistenceService_Schema.sql
  • SqlPersistenceService_Logic.sql

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

  

  其中,Bookmark代码如下:

    public sealed class Bookmark1<T> : NativeActivity<T>
{
public InArgument<string> 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());
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() == )
{
BookmarkResumptionResult BRR = instance.ResumeBookmark(instance.GetBookmarks()[].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什么的标记的对象),则持续化不会生效。

WF4 持久化 <第四篇>的更多相关文章

  1. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  2. 第四篇 Entity Framework Plus 之 Batch Operations

    用 Entity Framework  进行 增,删,改.都是基于Model进行的,且Model都是有状态追踪的.这样Entity Framework才能正常增,删,改. 有时候,要根据某个字段,批量 ...

  3. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  4. 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)

    解剖SQLSERVER 第十四篇    Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...

  5. 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)

    解剖SQLSERVER 第四篇  OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...

  6. 深入理解javascript作用域系列第四篇——块作用域

    × 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...

  7. 前端工程师技能之photoshop巧用系列第四篇——图片格式

    × 目录 [1]图片格式 [2]保存设置 前面的话 对于前端来说,图片格式是需要重要掌握的知识.本文是photoshop巧用系列第四篇——图片格式 图片格式 目前在前端的开发中常用的图片格式有jpg. ...

  8. 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

    温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...

  9. IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构(转载)

    IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构 系列文章链接: IIS负载均衡-Application Request Route详解第一篇: ...

随机推荐

  1. java.lang.StackOverflowError: stack size 8MB

    java.lang.StackOverflowError: stack size 8MB at android.text.TextUtils.getChars(TextUtils.java:86) a ...

  2. 类(class)、构造函数(constructor)、原型(prototype)

    类 Class 类的概念应该是面向对象语言的一个特色,但是JavaScript并不像Java,C++等高级语言那样拥有正式的类,而是多数通过构造器以及原型方式来仿造实现.在讨论构造器和原型方法前,我可 ...

  3. Eclipse下快速打开本地文件插件EasyExplorer(转)

    EasyExplorer  是一个类似于 Windows Explorer的Eclipse插件,它可以帮助你在不退出Eclipse的环境下浏览本地文件系统,类似的插件也有很多,但是本人喜欢使用这个版本 ...

  4. iPhone播放音乐

    来源:http://blog.csdn.net/htttw/article/details/7842295 iPhone播放音乐 今天我们简要介绍如何在iPhone中播放音乐: 强烈建议你参考官方文档 ...

  5. 关于DevExpress的GridView.VisibleIndex的赋值问题

    在DevExpress GridControl中,GridView中 如果VisibleIndex=-1,则这列将不会显示(不可见): 如果VisibleIndex>=0,则按照VisibleI ...

  6. Java SE 第十一讲----面向对象特征之封装2

    1.如果一个类包含了属性跟方法,那么该类的每一个对象都具有自己的属性,但无乱一个类有多少个对象,这些对象共享同一个方法. 2.关于方法参数传递的总结: 对于Java中的方法参数传递,无论传递的是原生数 ...

  7. ppm与毫克/立方米怎么换算

    ppm是溶液浓度(溶质质量分数)的一种表示方法,1升水溶液中有1毫克的溶质,g/m3或mg/L. 对于气体:,一百万体积的空气中所含污染物的体积数. 而按我国规定,特别是环保部门,则要求气体浓度以质量 ...

  8. [datatable]两个DataTable 连接

    using System; using System.Collections.Generic; using System.Text; using System.Data; namespace Cons ...

  9. C Primer Plus(第五版)1

    这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...

  10. (转)adb shell am 的用法

    原文地址:http://blog.csdn.net/fulinwsuafcie/article/details/8092459   adb shell am 的功能 adb shell am 使用此命 ...